我的应用程序在前台吗?
一个用于估计窗体是否位于所有其他窗口最前面的函数。
引言
这是一个有用的函数,用于估计一个窗体是否位于Z-order中所有可见窗口的最前面。
Windows平台使用Z-order来布局可见窗口,因此一个可见的窗口窗体可能被绘制在桌面的最前面,或者被其他窗口覆盖。 有时候,当你使用通知图标来使你的GUI更友好时,你可能会面临一个问题:当你点击图标时,应用程序应该执行什么样的操作? 最小化窗口? 将其带到最前面? 程序逻辑应该像这样
我们可以通过访问windowstate
属性来轻松估计一个窗体是否被最小化,但不幸的是,没有函数或属性可以找出窗体是否位于其他窗口的最前面。
我的解决方案是枚举从最顶层窗口到我的应用程序的句柄,并使用每个句柄来获取两种信息:首先,窗口是否可见? 如果是,那么第二,这个窗口的标题长度是否大于0? (这一步对于防止混淆BalloonTips和ContextMenuStrips非常重要。)
如果这两个条件都为真,则枚举的结果将增加1。 当枚举结束时,我们可以得到应用程序的Z-order编号。
使用代码
名为IsOnTop
的函数接受一个整数窗口句柄,并返回一个布尔值以指示句柄窗口是否位于最前面。
Private Function IsOnTop(ByVal hwnd As Integer) As Boolean
Dim i As Integer = GetTopWindow(0) 'Initialize
Dim x As Integer = 1
Dim s As String
' Enumeration
Do
i = GetNextWindow(i, 2) ' Find next window in Z-order
If i = hwnd Then
Exit Do
Else
If i = 0 Then ' Never find any window match the input handle
Return False
End If
End If
If IsWindowVisible(i) = True Then
s = Space(256)
If GetWindowText(i, s, 255) <> 0 Then
' Very important to prevent confusing
' of BalloonTips and ContextMenuStrips
x += 1
End If
End If
Loop
' x is Z-order number
If x = 1 Then
Return True
Else
Return False
End If
End Function
在这个函数中,我们使用四个Win32 API函数:GetTopWindow()
, GetNextWindow()
, IsWindowVisible()
, 和 GetWindowText()
。 下面是声明
Private Declare Function GetTopWindow Lib "user32" Alias "GetTopWindow" _
(ByVal hwnd As Integer) As Integer
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" _
(ByVal hwnd As Integer, ByVal wFlag As Integer) As Integer
Private Declare Function IsWindowVisible Lib "user32" Alias "IsWindowVisible" _
(ByVal hwnd As Integer) As Boolean
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Integer, ByVal lpString As String, _
ByVal cch As Integer) As Integer
您可以参考MSDN来检查这些API函数的详细信息
关注点
通过使用此功能,我们可以轻松创建一个智能通知图标。如果主窗体被最小化,单击该图标将还原窗口。如果主窗体处于活动状态,单击该图标将最小化窗口,并且如果主窗体未被最小化且处于非活动状态,通知图标将把它带到最前面。
我做了一个演示项目。 当你运行演示时,一个图标将出现在Windows任务栏上; 右键单击该图标将弹出一个菜单条,以显示你可以执行的操作。
对不起我糟糕的英语。 我曾经从这个网站的人那里获得了很多帮助,我想做些贡献。 这个功能是我在最近的一个项目中完成的; 我希望它对你有所帮助。
历史
- 2007年7月9日 - 第一个版本发布。