gpt4 book ai didi

c# - 从 c# windows 服务应用程序 Hook 窗口事件不起作用

转载 作者:可可西里 更新时间:2023-11-01 11:28:59 24 4
gpt4 key购买 nike

我正在尝试开发一个应用程序,该应用程序将 Hook Windows 事件并在例如发生时通知我。事件窗口已更改。我在 .net 4.0 VS 2010 中使用 Win7 64
为此,我创建了一个窗口服务类型的项目,在其中创建了一个服务安装程序,并使用 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 等)。

您需要在用户的本地桌面上运行一个进程并使用它来捕获事件。然后它可以与服务通信。

关于c# - 从 c# windows 服务应用程序 Hook 窗口事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25667277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com