2012-09-20 41 views
1

我知道如何获得正在运行的前台窗口应用程序的标题和exe名称,但我使用TTimer来验证它何时更改。如何检测应用程序焦点更改?

有没有办法检测由Alt + Tab,任务栏应用程序选择或甚至是新程序启动触发的事件?

我使用Delphi 2006和Windows 7 64位。

+1

搜索'SetWindowsHookEx',或者'SetWinEventHook'。 –

+0

触发器并不意味着你认为它的意思。 –

+2

另请参见[我必须做什么来使我的WH_SHELL或WH_CBT钩子过程接收来自其他进程的事件?](http://stackoverflow.com/questions/299370) – NGLN

回答

2

一种选择是安装全局钩子。在CBT hook的情况下,只要窗口被激活(除别的之外),系统就会调用钩子程序。全局钩子回调将被放置在一个dll中,该dll被加载到进程的地址空间中,因此它可以被映射到只有具有相同“比特”的进程(使用Delphi 2006,回调将只被调用32位流程)。此外,它不能映射到使用更高权限创建的进程的地址空间中(即,如果安装该钩子的进程不是以管理员身份运行的应用程序)。您还必须设计某种进程间通信机制,因为您的回调在其他应用程序中运行。您使用SetWindowsHookEx安装全局挂钩。

另一个选项是使用事件挂钩,即SetWinEventHook。有两种,in-contextout-of-context。前者像全局钩子一样放在一个dll中,映射到其他进程的地址空间中,所以你会遭受同样的负面影响。脱节事件是最轻松的事情。在通知时,他们不会像全局性的钩子或上下文事件那样迅速,但我相信这可能仍然会比定时器更好。在你的上下文中钩住事件的一个缺点是,你必须在回调中编写更多的代码,f.i.即使对于子窗口,您也会收到窗口焦点通知,并且您必须解析它属于哪个应用程序等。