我想开发一个应用程序,将挂钩到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