Есть ли способ перехватить событие уведомления windows в c#? - PullRequest
1 голос
/ 02 апреля 2020

Здравствуйте, я пытаюсь создать программу в c#, которая работает в фоновом режиме и активируется, когда вы получаете уведомление в windows, такое как письмо или телеграмма, есть ли способ перехватить это событие?

1 Ответ

0 голосов
/ 02 апреля 2020

A Windows Сервис - это не что иное, как программа Windows, запускаемая диспетчером управления службами (SCM). Службу можно запустить вручную или запланировать запуск SCM сразу после входа пользователя. Если вы не знакомы с ними, вы можете получить дополнительную информацию о MSDN.

Я протестировал код в Visual Studio 2008 Professional SP1, NET 3.5 SP1, Windows XP SP3. Он должен работать на любой платформе выше 2.0, и он может работать только в 1.1. Я бы посоветовал вам go через код, когда вы читаете текст, так как он станет намного более понятным для вас.

Сервисы имеют обработчик управления, который получает все сообщения от Windows. Они могут включать коды для остановки или приостановки службы или, как в нашем случае, события устройства. Управляемый сервис абстрагирует этот обработчик управления и предоставит вам только OnStart, OnStop и т. Д. Методы, которые вы можете реализовать для достижения необходимой функциональности. Однако нам нужно зарегистрировать наш собственный обработчик службы, чтобы мы могли перехватывать события устройства. Обратите внимание, что это отключит все обратные вызовы, такие как OnStop, кроме OnStart, который вызывается перед тем, как мы скажем Windows использовать наш обработчик.

API-функция Windows для этого - RegisterServiceCtrlHandlerEx, что принимает имя службы и функцию обратного вызова для вызова при получении сообщения. Мы назовем его функцией OnStart в нашем сервисе. Управляемая версия возвращает IntPtr, то есть service handle, но у нас уже есть свойство нашего класса, называемое ServiceHandle, поэтому нам не нужно его сохранять.

Подпись обработчика управления службой похожа на this:

Скрыть код копирования

public delegate int ServiceControlHandlerEx(int control, 
                int eventType, IntPtr eventData, IntPtr context);

Теперь мы можем go реализовать наш обратный вызов "OnStop", захватив событие SERVICE_CONTROL_STOP, полученное в "control "параметр обработчика. Но для обработки SERVICE_CONTROL_DEVICEEVENT нам нужно сделать что-то еще.

введите описание ссылки здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...