在我的应用激活之前检测哪个窗口处于活动状态

时间:2011-01-26 03:05:56

标签: windows delphi foreground

在Delphi XE中,我正在尝试使用GetForegroundWindow来检测在我的应用程序被激活之前立即激活的窗口。 “已激活”表示应用程序可能已从标志状态恢复,或者已通过alt + tab切换,或通过激活热键等启动。

问题是所有可用的应用程序事件(OnActivate,OnRestore)来得太晚,因此GetForegroundWindow返回我自己的表单的句柄。主要形式的事件甚至没那么有用。在主窗体中处理WM_ACTIVATEAPP也发生得太晚了。

一种方法是在我的应用程序未激活时继续检查计时器上的活动窗口,但这似乎相当浪费。一个更好的解决方案是继承TApplication.WndProc并在处理WM_ACTIVATEAPP之前完成我的工作,但我不认为TApplication可以是子类。

有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

当您的应用程序激活时,它将成为最顶层的窗口。 IOW,它跳到顶部的Z顺序位置。

有了这个,之前的最顶层窗口被降级为“正好在新的最顶层窗口下方”位置。 IOW,它在Z顺序位置成为第二位。

调用GetNextWindow并传递表单句柄和GW_HWNDNEXT可能会为您提供所需的结果。

答案 1 :(得分:0)

所有窗口都有一个z顺序,这是一个窗口用于确定哪个窗口应该在其上绘制的数字。

激活程序时,您的应用程序将放在z列表的顶部。

当您按alt-tab时,窗口将循环显示该列表。所以按下alt-tab并按住它,看看是怎么订购的。

检查一下,了解如何模拟alt-tab: http://www.swissdelphicenter.ch/torry/showcode.php?id=2103