6

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

问题是所有可用的应用程序事件(OnActivate、OnRestore)都来得太晚了,所以 GetForegroundWindow 返回我自己的表单句柄。主窗体的事件就更没用了。在主窗体中处理 WM_ACTIVATEAPP 也太晚了。

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

有没有更好的办法?

4

2 回答 2

6

When your application activates, it becomes the topmost window. IOW, it jumps to the top Z-order position.

With this, previous topmost window is demoted to the "just below the new topmost window" position. IOW, it becomes second in the Z-order position.

Calling GetNextWindow and passing it the handle of your form and GW_HWNDNEXT may give you just the result you need.

于 2011-01-26T11:51:49.657 回答
0

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

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

当您按下 alt-tab 时,Windows 会在该列表中循环。所以按住 alt-tab 并按住它,看看东西是如何排序的。

看看这个看看如何模拟alt-tab: http ://www.swissdelphicenter.ch/torry/showcode.php?id=2103

于 2011-01-26T11:57:40.567 回答