我知道如何获得正在运行的前台窗口应用程序的标题和exe名称,但我使用TTimer
来验证它何时更改。如何检测应用程序焦点更改?
有没有办法检测由Alt + Tab,任务栏应用程序选择或甚至是新程序启动触发的事件?
我使用Delphi 2006和Windows 7 64位。
我知道如何获得正在运行的前台窗口应用程序的标题和exe名称,但我使用TTimer
来验证它何时更改。如何检测应用程序焦点更改?
有没有办法检测由Alt + Tab,任务栏应用程序选择或甚至是新程序启动触发的事件?
我使用Delphi 2006和Windows 7 64位。
一种选择是安装全局钩子。在CBT hook的情况下,只要窗口被激活(除别的之外),系统就会调用钩子程序。全局钩子回调将被放置在一个dll中,该dll被加载到进程的地址空间中,因此它可以被映射到只有具有相同“比特”的进程(使用Delphi 2006,回调将只被调用32位流程)。此外,它不能映射到使用更高权限创建的进程的地址空间中(即,如果安装该钩子的进程不是以管理员身份运行的应用程序)。您还必须设计某种进程间通信机制,因为您的回调在其他应用程序中运行。您使用SetWindowsHookEx
安装全局挂钩。
另一个选项是使用事件挂钩,即SetWinEventHook
。有两种,in-context和out-of-context。前者像全局钩子一样放在一个dll中,映射到其他进程的地址空间中,所以你会遭受同样的负面影响。脱节事件是最轻松的事情。在通知时,他们不会像全局性的钩子或上下文事件那样迅速,但我相信这可能仍然会比定时器更好。在你的上下文中钩住事件的一个缺点是,你必须在回调中编写更多的代码,f.i.即使对于子窗口,您也会收到窗口焦点通知,并且您必须解析它属于哪个应用程序等。
搜索'SetWindowsHookEx',或者'SetWinEventHook'。 –
触发器并不意味着你认为它的意思。 –
另请参见[我必须做什么来使我的WH_SHELL或WH_CBT钩子过程接收来自其他进程的事件?](http://stackoverflow.com/questions/299370) – NGLN