[英]Hook to window events from a c# windows service application does not work
我正在尝试开发一个应用程序,它将挂钩到Windows事件并通知我何时为例如。 活动窗口已更改。 我正在使用Win7 64与.net 4.0 VS 2010
为此,我创建了一个Window Service类型的项目,在其中创建了一个服务安装程序,以及我使用来自user32.dll的SetWinEventHook注册到事件的模板服务项目中的OnStart方法。 一切似乎都很好,除了我没有在传递给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(桌面)上运行。 即使没有服务,也可以有几个窗口站(RDP,UAC等)。
您需要在用户的本地桌面上运行进程并使用它来捕获事件。 然后它可以与服务进行通信。
什么@DavidCrowell说,加上你可能能够使用这个属性的服务(从未尝试过):
根据这个MS页面 ,
在大多数情况下,建议您不要更改允许服务与桌面交互设置。 如果您允许服务与桌面交互,则服务在桌面上显示的任何信息也将显示在交互式用户的桌面上。 然后,恶意用户可以控制服务或从交互式桌面攻击它。
由于这意味着两个桌面上的窗口之间的交互,如果在服务上设置此属性,则可以使用挂钩。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.