我的应用程序在上面吗?

介绍 这是一个有用的函数,用于估计表单是否按z顺序位于所有可见窗口的顶部。 Windows平台使用z顺序来布局可见窗口,因此可见窗口窗体可以绘制在桌面的顶部或被其他窗口覆盖。有时,当您使用通知图标来使您的GUI更加友好时,您可能会面临一个问题:当您单击图标时,应用程序应该执行什么样的操作?最小化窗口吗?把它带到前面?程序逻辑应该像这样: 通过访问windowstate属性,我们可以很容易地估计一个表单是否最小化了,但遗憾的是,没有函数或属性可以查明一个表单是否在其他窗口的顶部。 我的解决方案是枚举顶部窗口的句柄直到我的应用程序,并使用每个句柄来获取两种信息:第一,窗口是可见的吗?如果是,则第二个窗口的标题长度是否大于0?(这一步非常重要,以防止混淆气球的尖端和背景菜单。) 如果两个条件都为真,枚举的结果将增加1。枚举结束后,我们可以得到应用程序的z顺序号。 使用的代码 IsOnTop函数接受一个整数窗口句柄,并返回一个布尔值来指示句柄窗口是否在顶部。 隐藏,收缩,复制Code

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()。声明如下: 隐藏,复制Code

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函数的详细信息: GetTopWindowGetNextWindowIsWindowVisibleGetWindowText 的兴趣点 通过使用这个功能,我们可以很容易地创建一个智能的通知图标。如果主窗体被最小化,单击图标将恢复窗口。如果主窗体是活动的,单击图标将使窗口最小化,如果主窗体没有最小化并且处于非活动状态,则通知图标将使其出现在前面。 我做了一个演示项目。当你运行演示程序时,Windows任务栏上会出现一个图标;右击图标将弹出一个菜单条,显示您可以做的操作。 对不起,我的英语很差。我曾经在这个网站上获得了很多人的帮助,我想贡献自己的力量。这个功能是我在最近的一个项目中完成的;我希望它能帮助你们中的一些人。 历史 2007年7月9日-第一个版本。 本文转载于:http://www.diyabc.com/frontweb/news6987.html

原文地址:https://www.cnblogs.com/Dincat/p/13467464.html