Я пытаюсь разработать приложение, которое будет подключаться к событиям Windows и уведомлять меня, когда, например. активное окно изменилось. Я использую Win7 64 с.net 4.0 VS 2010
Для этого я создал проект типа Window Service, создал в нем установщик служб и метод OnStart из проекта службы шаблонов, который я зарегистрировал для событий, используя SetWinEventHook из user32.dll. Все кажется прекрасным, за исключением того факта, что я не получаю ничего в методе обратного вызова, переданного SetWinEventHook. Мой код выглядит так:
protected override void OnStart(string[] args)
{
workerThread = new Thread(OnTimer);
workerThread.Start();
}
public void OnTimer()
{
UserWatchdog userWatchdog = new UserWatchdog();
UserWatchdog.SubscribeToWindowEvents();
ScreenTime.EventLoop.Run();
}
public static WinEventProc _winEventProc = new WinEventProc(WindowEventCallback);
public static void SubscribeToWindowEvents()
{
if (windowEventHook == IntPtr.Zero)
{
windowEventHook = SetWinEventHook(
0x00000001,
0x7FFFFFFF,
IntPtr.Zero, // hmodWinEventProc
_winEventProc,
0, // idProcess
0, // idThread
WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
}
}
private static void WindowEventCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
//I NEVER GET HERE
ScreenTime.WatchdogAnalyzer.analyze(hwnd);
}
public static void Run()
{
MSG msg;
while (!_shouldStop)
{
WatchdogAnalyzer.printActiveWindow();
if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE))
{
if (msg.Message == WM_QUIT)
break;
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
}
}
У вас есть идея, почему я не получаю никаких событий от Win? спасибо
Служба работает на другой Window Station (Desktop), чем пользовательские приложения. Даже без сервисов может быть несколько оконных станций (RDP, UAC и т.д.).
Вам нужно будет запустить процесс на локальном рабочем столе пользователя и использовать его для обнаружения событий. Затем он может связаться с сервисом.
Что сказал @DavidCrowell, плюс вы, возможно, сможете использовать это свойство для службы (никогда не пробовали):
На этой странице MS,
В большинстве случаев рекомендуется не разрешать службе "Разрешить" взаимодействовать с настройками рабочего стола. Если вы разрешаете службе взаимодействовать с рабочим столом, любая информация, отображаемая службой на рабочем столе, также будет отображаться на интерактивном рабочем столе пользователя. Затем злоумышленник может взять под свой контроль сервис или атаковать его с интерактивного рабочего стола.
Поскольку это подразумевает взаимодействие между окнами на двух рабочих столах, вы можете использовать свой крючок, если вы установите это свойство в службе.