gpt4 book ai didi

.NET/Win32 - 检测属于另一个应用程序的窗口何时获得焦点的事件

转载 作者:行者123 更新时间:2023-12-04 14:33:41 26 4
gpt4 key购买 nike

我有一个 .NET 应用程序,它需要能够检测特定窗口何时获得和失去焦点。我感兴趣的特定窗口属于我无法控制的另一个应用程序,尽管我确实有窗口句柄。

我真的在寻找解决这个问题的最佳方法。到目前为止,我可以看到两种可能性:

  • 在计时器上使用 Win32 调用来监视状态的任何变化。不太好,因为它存在丢失状态更改的风险,例如如果窗口变为事件,则在计时器间隔内变为非事件
  • 使用钩子(Hook) (SetWindowsHookEx) 拦截到窗口的消息。听起来它应该可以工作,但担心 a) 全局级别的钩子(Hook)不能从 .NET 代码工作,所以需要是 native 的,b) 这可能被认为是病毒/键盘记录器类型的事件,因此被操作系统阻止了吗?

  • 我敢肯定还有其他选择,如果是这样,我很想听听!

    最佳答案

    最简单的方法可能是使用SetWinEventHook ,监听 EVENT_SYSTEM_FOREGROUND 事件。您需要将它与 WINEVENT_OUTOFCONTEXT 标志一起使用以在 .net 中使用它:当您使用此标志时,Windows 会将通知路由回您自己的进程,因此您不需要单独的非托管 DLL。但是请注意,调用此方法的代码必须运行消息循环。

    快速说明这与另一个答案中提到的文章有何关系:该文章侧重于 SetWindowsHook API。 SetWinEventHook 是一个单独的 API,但您使用相同的技术来设置 P/Invoke 调用,并为回调设置委托(delegate) - 但请注意,这两个 API 在 API 调用本身和回调中使用不同的参数. SetWinEventHook 相对于 SetWindowsHook 的主要优势在于,对于某些类型的 Hook ,SetWindowsHook 需要使用单独的非托管 DLL,而您不能直接在 .net 中执行此操作。然而,SetWinEventHook 允许任一类型的回调,使用单独的非托管 DLL 或通知原始进程而不需要 DLL,因此对 .net 更友好。

    关于.NET/Win32 - 检测属于另一个应用程序的窗口何时获得焦点的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7150895/

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