如何检测应用程序焦点更改?

时间:2012-09-20 00:35:44

标签: delphi delphi-2006

我知道如何获取现在正在运行的前景窗口应用程序的标题和exe名称,但我使用TTimer来验证它何时发生变化。

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

我使用Delphi 2006和Windows 7 64位。

1 个答案:

答案 0 :(得分:2)

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

另一个选择是使用事件挂钩,即SetWinEventHook。有两种,in-contextout-of-context。前一个,就像一个全局钩子,放在一个dll中,映射到其他进程的地址空间,所以你会遇到同样的缺点。脱离背景的事件是最放松的。在通知时,它们不会作为全局钩子或上下文事件提示,但我相信它仍然可以比计时器更好。在您的上下文中挂钩事件的一个缺点是,您必须在回调函数f.i中进行更多编码。即使对于子窗口,您也会收到窗口焦点通知,您必须解决它所属的应用程序等。