【问题标题】:Is there Windows system event on active window changed?活动窗口上的 Windows 系统事件是否已更改?
【发布时间】:2011-05-23 09:35:26
【问题描述】:

我正在开发的桌面应用程序需要知道在应用程序运行时哪些窗口处于活动状态。目前它每 250 毫秒执行一次GetForegroundWindow() 调用(user32.dll)。这种方法不是很准确。

是否有任何 Windows (WINAPI?) 事件在每次活动(聚焦)窗口更改时触发?我想订阅我的回调函数。

谢谢。

【问题讨论】:

标签: c# .net windows winapi hook


【解决方案1】:

WM_ACTIVATE message,它被发送到激活和停用的窗口。

【讨论】:

  • 这不是我要找的那个。订阅系统中的每个窗口是不合理的。 :)
  • @Vasiliy Borovyak:啊,那没关系 - 我误解了,认为您只需要特定窗口的活动状态。
【解决方案2】:

是的,您可以使用SetWinEventHook 函数。

hEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND , 
    EVENT_SYSTEM_FOREGROUND , NULL, 
    WinEventProcCallback, 0, 0, 
    WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);

.......

VOID CALLBACK WinEventProcCallback ( HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
    /* your code here */
}

【讨论】:

  • 看起来这就是我要找的那个。让我看看。
  • 我从未尝试过 EVENT_SYSTEM_FOREGROUND,但我使用 SetWinEventHook 钩住了 EVENT_OBJECT_LOCATIONCHANGE 事件来处理 Windows 位置更改,它对我来说效果很好。
  • 为什么 C# 问题有 C/C++ 答案?
  • @Chris 知道 Win32 调用允许您使用 p/invoke pinvoke.net/default.aspx/user32/SetWinEventHook.html
  • 投反对票,因为它是伪代码。几乎什么都没有,无论是方法还是那些参数,甚至编译器都找不到“VOID CALLBACK”这个东西。没有任何效果。
猜你喜欢
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多