如何检测我的应用程序是最顶层的窗口

时间:2015-07-02 15:58:19

标签: windows winforms

“休眠”应用程序有七种方式可以成为“活动”应用程序,基于它是最小化还是简单模糊的组合,以及是否通过alt-tab,鼠标重新激活它点击它的图标,通过从另一个程序发送一个Windows消息重新激活,或者当关闭(或最小化)模糊应用程序时,它被简单地“发现”为桌面上最顶层的应用程序。

在所有情况下,我都需要知道我的应用程序现在是活动的(例如桌面上最顶层的)应用程序,以便我可以从数据库刷新其数据。

我确实知道应用程序“知道”它们是最顶级的,因为我可以看到边框一旦变为最顶端就会变为活动颜色。

如果我捕获WM_ACTIVATE_APP消息,这大部分时间都有效,但是当我的应用程序被最小化并恢复到活动状态时似乎没有。

我需要被告知,在用户执行任何操作之前,我的应用程序现在是最顶级且最活跃的。

有什么建议吗?谢谢,戴夫

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

经过这样的时间后,数据库中的数据应被视为过时,请在窗口(或WinForms等效项)上调用InvalidateRect()。如果您的窗口没有被遮挡,它将立即获得WM_PAINT。但是如果窗口被完全遮挡,它就不应该获得WM_PAINT直到OS实际需要显示它 - 即当移动模糊窗口时。刷新数据库中的数据以响应WM_PAINT消息。

结果是Raymond Chen blogged about this back in 2003

答案 1 :(得分:0)

经过调查,我找到了问题的原因和解决方法。

我发现WM_ACTIVATEAPP消息正在发送(并已收到)确定,但这发生在应用仍处于最小化状态时(即在恢复之前)。

因为我有一个if测试,当应用程序被最小化时没有做任何事情(这是没有意义的,因为用户看不到结果!),没有采取任何行动。

当应用程序“未被覆盖”时,WM_ACTIVATEAPP消息 被发送,这是可以的,因为应用程序未被最小化。

我现在也回应WM_WINDOWPOSCHANGED在恢复时被解雇, 这个组合似乎涵盖了我的应用程序可以重新激活的所有七种方式。