Ваша лучшая (и, безусловно, самая безопасная) ставка заключается в создании службы, которая принимает элемент управления SERVICE_CONTROL_SESSIONCHANGE.
Это позволит вашему обработчику управления службами получать управление всякий раз, когда пользователь входит в систему, выходит из системы, блокирует сеанс и другие различные параметры. Ищите больше информации в ссылке удара.
Это делается путем создания службы с флагом SERVICE_ACCEPT_SESSIONCHANGE в dwControlsAccepted следующим образом:
SERVICE_STATUS ss;
...
ss.dwControlsAccepted |= SERVICE_ACCEPT_SESSIONCHANGE;
Далее:
// This lets the service accept the session change ctrls
// The service handle here is received by calling RegisterServiceCtrlHandler
SetServiceStatus(hServiceHandle,
&ss);
Это позволит Windows отправлять элементы управления SERVICE_CONTROL_SESSIONCHANGE в вашу функцию HandlerEx, которая должна выглядеть примерно так:
DWORD WINAPI HandlerEx(DWORD dwControl,
DWORD dwEventType,
LPVOID lpEventData,
LPVOID lpContext)
{
switch (dwControl)
{
...// Regular control handling
case (SERVICE_CONTROL_SESSIONCHANGE):
switch(dwEventType)
{
case(WTS_SESSION_LOGON):
// Handle logon
break;
case(WTS_SESSION_LOCK):
// Handle lock
break;
...
}
break;
...
}
}
Вы можете ознакомиться со всеми различными уведомлениями об изменениях сеанса, которые можно получить здесь: WM_WTSSESSION_CHANGE , все необходимые уведомления находятся в части описания wParam.
Ну, в этом-то и суть. Вы можете прочитать более подробную информацию о функции handlerex здесь: HandlerEx и больше информации об услугах в целом здесь: Сервисные функции . Я предлагаю вам ознакомиться с функцией ServiceMain, функцией RegisterServiceCtrlHandler и, что наиболее важно, прочитать примеры, размещенные на страницах MSDN. Они очень полезны.
Удачи!