我想開發一個應用程序,將掛鉤到Windows事件並通知我何時例如。活動窗口已更改。我正在使用Win7 64與.net 4.0 VS 2010
爲此,我製作了一個Window Service類型的項目,在其中創建了一個服務安裝程序,並使用從User32.dll中註冊到事件的模板服務項目中的OnStart方法使用SetWinEventHook 。除了傳遞給SetWinEventHook的回調方法中沒有收到任何東西外,一切看起來都很好。 我的代碼如下所示:從C#窗口服務應用程序掛鉤窗口事件不起作用
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);
}
}
}
你有任何想法,爲什麼我沒有得到任何來自運事件? 謝謝
就像大衛說的,你不想實現這個作爲Windows服務。只需製作一個普通的Windows程序,也許沒有UI,然後讓用戶通過將其包含在他/她的Startup文件夾或通過自動啓動程序的註冊表項中來運行它。 – RenniePet 2014-09-04 14:11:52