Код, который вы здесь видите, находится в системном уведомлении NOTIFICATION_EVENT_RS232_DETECTED
. Используя CeRunAppAtEvent (немного неправильно, так как не будет запускать приложение, а вместо этого будет установлено событие), они зарегистрировали именованное системное событие с именем «EventActiveSync», которое будет установлено при получении уведомления.
По сути, когда устройство подключено, будет установлено указанное системное событие.
В вашем коде есть часть кода ожидания, но не полностью - он вызывает WaitForSingleObject, но никогда не просматривает результат, а затем снимает событие. Я думаю, что это будет выглядеть так
event EventHandler OnConnect = delegate{};
void ListenerThreadProc()
{
var eventName = "OnConnect";
// create an event to wait on
IntPtr @event = NativeMethods.CreateEvent (IntPtr.Zero, true, false, eventName);
// register for the notification
NativeMethods.CeRunAppAtEvent (
string.Format("\\\\.\\Notifications\\NamedEvents\\{0}", eventName),
(int) NOTIFICATION_EVENT.NOTIFICATION_EVENT_RS232_DETECTED);
while(!m_shutdown)
{
// wait for the event to be set
// use a 1s timeout so we don't prevent thread shutdown
if(NativeMethods.WaitForSingleObject(@event, 1000) == 0)
{
// raise an event
OnConnect(this, EventArgs.Empty);
}
}
// unregister the notification
NativeMethods.CeRunAppAtEvent (
string.Format("\\\\.\\Notifications\\NamedEvents\\{0}", eventName),
(int) NOTIFICATION_EVENT.NOTIFICATION_EVENT_NONE);
// clean up the event handle
NativeMethods.CloseHandle(@event);
}
Ваше приложение создаст поток, который использует этот процесс при запуске, и подключит обработчик события для события OnConnect.
FWIW, в SDF это уже выполнено , поэтому в вашем коде это будет выглядеть примерно так:
DeviceManagement.SerialDeviceDetected += DeviceConnected;
...
void DeviceConnected()
{
// handle connection
}