65.9K
CodeProject 正在变化。 阅读更多。
Home

我的应用程序在前台吗?

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (6投票s)

2007年7月9日

CPOL

2分钟阅读

viewsIcon

41570

downloadIcon

394

一个用于估计窗体是否位于所有其他窗口最前面的函数。

引言

这是一个有用的函数,用于估计一个窗体是否位于Z-order中所有可见窗口的最前面。

Windows平台使用Z-order来布局可见窗口,因此一个可见的窗口窗体可能被绘制在桌面的最前面,或者被其他窗口覆盖。 有时候,当你使用通知图标来使你的GUI更友好时,你可能会面临一个问题:当你点击图标时,应用程序应该执行什么样的操作? 最小化窗口? 将其带到最前面? 程序逻辑应该像这样

Screenshot - flow.jpg

我们可以通过访问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日 - 第一个版本发布。
© . All rights reserved.