我知道如何获取正在运行的前台窗口应用程序的标题和 exe 名称,但我使用 aTTimer
来验证它何时更改。
有没有办法检测由 Alt+Tab、任务栏应用程序选择甚至新程序的启动触发的事件?
我使用 Delphi 2006 和 Windows 7 64 位。
我知道如何获取正在运行的前台窗口应用程序的标题和 exe 名称,但我使用 aTTimer
来验证它何时更改。
有没有办法检测由 Alt+Tab、任务栏应用程序选择甚至新程序的启动触发的事件?
我使用 Delphi 2006 和 Windows 7 64 位。
一种选择是安装全局挂钩。使用CBT 钩子,只要窗口被激活(除其他外),系统就会调用钩子过程。全局挂钩回调将放置在加载到进程地址空间中的 dll 中,因此它只能映射到具有相同“位”的进程(使用 Delphi 2006,回调将仅由 32 位调用过程)。此外,它不能映射到以更高权限创建的进程的地址空间(即,如果安装挂钩的进程不是以管理员身份运行的应用程序)。您还必须设计某种进程间通信机制,因为您的回调在其他应用程序中运行。你SetWindowsHookEx
用来安装一个全局钩子。
另一种选择是使用事件挂钩,即SetWinEventHook
. 有两种,in-context和out-of-context。前一个,就像一个全局钩子,被放置在一个 dll 中以映射到其他进程的地址空间,所以你会遇到同样的缺点。断章取义的事件是最轻松的。在通知时它们不会被提示为全局钩子或上下文事件,但我相信这仍然比计时器更好。在您的上下文中挂钩事件的一个缺点是,您必须在回调中编写更多代码,即使对于子窗口,您也会收到窗口焦点通知,并且您必须解决它属于哪个应用程序等。 .