我有一个.NET应用程序需要能够检测特定窗口何时获取并失去焦点。我感兴趣的特定窗口属于我无法控制的另一个应用程序,虽然我有窗口句柄。
我真的想要解决这个问题的最佳方法。到目前为止,我可以看到两种可能性:
我确定还有其他选择,如果有的话,我很乐意听到它们!
答案 0 :(得分:8)
最简单的方法是使用SetWinEventHook,监听EVENT_SYSTEM_FOREGROUND事件。您需要将它与WINEVENT_OUTOFCONTEXT标志一起使用才能在.net中使用它:当您使用此标志时,Windows会将通知路由回您自己的进程,因此您不需要单独的非托管DLL。但请注意,调用此方法的代码必须运行消息循环。
快速说明这与其他答案中提到的文章有何关联:该文章重点介绍SetWindowsHook API。 SetWinEventHook是一个单独的API,但您使用相同的技术来设置P / Invoke调用,并为回调设置委托 - 尽管请注意两个API在API调用本身和回调中使用不同的参数。 SetWinEventHook相对于SetWindowsHook的主要优点是,对于某些类型的钩子,SetWindowsHook 需要使用单独的非托管DLL,这是您无法直接在.net中执行的。但是,SetWinEventHook允许使用单独的非托管DLL或者在不需要DLL的情况下通知原始进程的任何类型的回调,因此更加友好。
答案 1 :(得分:0)
这是一篇关于在MSDN杂志中使用.NET实现Windows钩子的精彩文章:Windows Hooks in the .NET Framework。
关于你的第二个问题,我从未听说过将这些api调用视为间谍软件行为的反病毒。
希望它有所帮助!