2011-01-26 95 views
5

在Delphi XE中,我试图使用GetForegroundWindow来检测在激活应用程序之前激活的窗口。 “已激活”表示应用程序可能已从图标状态恢复,或者已通过alt +选项卡切换,或通过激活热键等提供。在我的应用程序激活之前检测到哪个窗口处于活动状态

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

一种方法是在应用程序不活动时继续检查定时器上的活动窗口,但这看起来很浪费。一个更好的解决方案是将TApplication.WndProc子类化并在处理WM_ACTIVATEAPP之前完成我的工作,但我不认为TApplication可以被子类化。

有没有更好的方法?

+4

您可以处理任何消息`TApplication.WndProc`接收调用`Application.HookMainWindow`。在TApplication执行任何自己的处理之前,hook程序被调用。尽管如此,我不知道'wm_ActivateApp`能否可靠地告诉你想让你认为你需要知道。 – 2011-01-26 03:35:49

回答

5

当您的应用程序激活时,它将成为最上面的窗口。 IOW,它跳转到最高Z位置。

这样,以前的最上面的窗口被降为“刚刚在新的最上面的窗口的下面”位置。 IOW,它在Z顺序位置成为第二位。

调用GetNextWindow并传递它的表单句柄和GW_HWNDNEXT可能会给你你需要的结果。

0

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

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

当您按alt-tab时,窗口循环遍历该列表。所以按alt-tab并按住它,看看东西是如何订购的。

检查了这一点,看看如何模拟ALT标签: http://www.swissdelphicenter.ch/torry/showcode.php?id=2103

相关问题