windows - 跟踪移动的桌面窗口 WinApi

标签 windows winapi

我正在尝试跟踪移动的桌面应用程序窗口,以便我可以平移相应的透明覆盖窗口。目前,我使用 SetWinEventHook Hook EVENT_SYSTEM_MOVESIZEEND 事件。在我的回调中,我使用目标应用程序窗口的新位置更新了我的叠加层的位置。

这行得通,但这意味着在用户放开目标窗口的标题栏后,我的叠加层会跳来跳去。我希望我的叠加层能够移动时跟踪目标窗口,而不是在它移动之后。

我能想到的唯一方法是同时 Hook EVENT_SYSTEM_MOVESIZESTART 事件。当 START 事件触发时,生成一个新线程来轮询目标窗口位置并更新我的覆盖位置。然后,当 END 事件触发时,终止轮询线程。

这是一种合理的方法,还是有更好的方法来实现我想要的功能。

谢谢。

最佳答案

根据 Hans Passant 对我的问题的建议。我确实想 Hook EVENT_OBJECT_LOCATIONCHANGE 而不是 EVENT_SYSTEM_MOVESIZEEND。一旦我 Hook LOCATIONCHANGE,跟踪就会按预期进行。

请注意,通过 Hook LOCATIONCHANGE,您还将收到窗口的鼠标事件。您可以通过检查WinEventProc 回调函数的hwnd 轻松过滤窗口的移动。

MSDN:

生成事件的窗口句柄,如果没有窗口与事件关联,则为 NULL。例如,鼠标指针不与窗口关联。

关于windows - 跟踪移动的桌面窗口 WinApi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22020777/

相关文章:

c++ - FileInformation - 提取文件重命名详细信息

c++ - 无法将参数从 'LPITEMIDLIST *' 转换为 'LPCITEMIDLIST *'

php - 如何用 PHP 编写 Windows 应用程序?

java - 如何在 Java 中获取 Windows 用户名?

linux - 不同平台上的 tcl/tk 复杂脚本支持

c++ - 我怎样才能得到执行我的程序的人的用户名?

python - 在 Windows 上使用 python 自动 NTLM

c++ - 即使未包装在 extern "C"中,也会调用 DllMain() 吗?

c - 正则表达式中 *.* 和 * 有什么区别?

winapi - 媒体播放器经典 - 以编程方式跳转到视频/音频中的点