Обработка событий WM_ в процессе C # без окон

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

В основном у меня есть процесс 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 не достигаются.

Есть подсказка?


person user1250991    schedule 06.03.2012    source источник
comment
Прошло некоторое время с тех пор, как я играл на этом уровне, но я, кажется, помню, что использовал 0 для HWND (я, кажется, помню, что где-то читал, был HWND рабочего стола). Мне пришлось бы покопаться в своих архивах, чтобы проверить, но я почти уверен, что это сработало.   -  person M.Babcock    schedule 06.03.2012


Ответы (1)


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

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

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

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

person Chris Shain    schedule 06.03.2012
comment
Крис прав. Если ваше приложение не предотвращает завершение работы по запросу, оно должно закрыться без ошибок. Поэтому следующий вопрос: зачем писать приложение как фоновое приложение без окон, а не как службу Windows? - person Rich Turner; 06.03.2012
comment
@RichardTurner - Как вы ожидаете, что служба Windows сможет перехватывать события Windows? - person M.Babcock; 06.03.2012
comment
@ M.Babcock он не упоминает об обработке клавиш Windows и событий мыши, кроме WM_CLOSE и WM_DESTROY (которые, по-видимому, ему нужно только для закрытия приложения, что, как я указываю, не обязательно) - person Chris Shain; 06.03.2012
comment
@ChrisShain - Отредактировано. Я слишком углубился в вопрос. Я не говорю, что ваш вопрос неправильный, но если OP должен сделать это таким образом (для какого-то неизвестного углового случая), тогда служба Windows тоже не поможет. - person M.Babcock; 06.03.2012
comment
@ChrisShain - Спасибо за информацию. Ссылка о процессе завершения работы интересна, но он специально не обсуждает мою ситуацию, которая представляет собой приложение без пользовательского интерфейса, которое меня (очевидно) больше интересует. Кроме того, да, в настоящее время меня интересуют только WM_CLOSE, WM_DESTROY, WM_QUERYENDSESSION (возможно, ) и WM_ENDSESSION (как видно из статьи, которую вы связали). Решение для скрытого главного окна в C # на самом деле кажется кладжем (к сожалению), просто создавая окно вне экрана без записи на панели задач. знак равно - person user1250991; 06.03.2012
comment
Ситуация могла измениться за последние 5 лет и 3 месяца, но почему бы просто не создать скрытое окно? Скрытое окно может затем получить все события Windows, которые вам нравятся. Если вы не делаете CLI, это не должно вызывать никаких проблем ... - person Sancarn; 09.06.2017