Обработка событий WM_ в безоконный процесс C # - PullRequest
1 голос
/ 06 марта 2012

Я уже некоторое время осматриваюсь и не могу найти хороший способ сделать это.

В основном у меня есть процесс на C # с использованием WPF (у которого нет видимого окна),что мне нужно обрабатывать события WM_ (например, WM_CLOSE или WM_DESTROY; чтобы я мог элегантно завершить работу, когда пользователь решит выйти из системы или перезагрузить компьютер).

Существует рядрешений, которые я видел там, которые предлагают использовать System.Windows.InteropServices для вызова AddHook и предоставить ему указатель на функцию, которая затем становится WndProc.Проблема в том, что, насколько я могу судить, это зависит от того, действительно ли окно является видимым (и в этом случае нет окна).

Другой способ, который предлагается, но не работает, - переопределениеWndProc метод WinForm, но этот процесс не имеет видимых форм или окон.

Я также нашел вещи, относящиеся к окну только для сообщений.Какое-то невидимое окно, которое все еще принимает события WM_.Из того, что я видел, это доступно только в Microsoft.WindowsCE.Forms сборке.Я добавил ссылку на эту сборку в свой проект и поместил в подкласс MessageWindow, как указано по адресу: http://msdn.microsoft.com/en-us/library/microsoft.windowsce.forms.messagewindow.aspx, но он все еще не работает.Точки останова внутри WndProc не подвергаются ударам.

Любая подсказка?

1 Ответ

1 голос
/ 06 марта 2012

Подумайте о том, что вы спрашиваете - если у вас нет окна, как ваше приложение может получать оконное сообщение (учитывая, что сообщения отправляются на дескриптор окна).

Это все равно что сказать: «Как я могу получать электронную почту, не имея адреса электронной почты?»

Майкл Энтин освещает поведение окон во время выключения здесь .

Я на 99% уверен, что все процессы, запущенные в сеансе пользователя, автоматически закрываются, когда пользователь выходит из системы, так что это не должно быть проблемой.Если вам действительно нужно обработать это оконное сообщение, вы можете создать скрытое окно согласно Любой способ создать скрытое главное окно в C #?

...