我的 WPF 元素是否在屏幕上可见或被任何应用程序的另一个 window 隐藏

Is my WPF element visible on the screen or hidden by another window of any application

我如何知道我的 WPF 应用程序中的元素是否被任何应用程序的另一个 window 隐藏

以下是我如何在屏幕上获取有关打开 windows 的信息的示例。例如:我的应用程序是否在顶部。

(我在http://www.codeproject.com/Articles/19529/Is-My-Application-on-Top中学到的基本代码)

 Declare Function GetTopWindow Lib "user32" Alias "GetTopWindow" (ByVal hwnd As Integer) As Integer
    Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Integer, ByVal wFlag As Integer) As Integer
    Declare Function IsWindowVisible Lib "user32" Alias "IsWindowVisible" (ByVal hwnd As Integer) As Boolean
    Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
    Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As IntPtr, ByRef pwi As Rect) As Boolean

    Function IsOnTop(ByVal hwnd As Integer) As Boolean
        Dim i As Integer = GetTopWindow(0)
        Dim x As Integer = 1
        Dim s As String

        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

    Public Function GetWindowText(ByVal hWnd As IntPtr) As String
        Dim s = Space(256)
        GetWindowText(hWnd, s, 255)
        Return s.ToString()
    End Function

    Function GetRectWindow(hwnd As Integer) As Rect
        Dim rc As Rect
        GetWindowRect(hwnd, rc)
        Return rc
    End Function

我需要知道其他 windows 的宽度和高度。没有这些数据,我仍然无法知道某个元素是否对用户隐藏。例如,在我的应用程序中,我有一个包含两个 DataGrid 的 window,其中一个可能被其他应用程序隐藏。

问题是,虽然 GetRectWindow 方法 returns 这个数据,但是,例如,它给出的 Width 属性 = 4.09332988076806E-311 应该是 350。据我所知,它使用缇单位。我把它转换为像素单位,但我得到的结果是一个无穷大的数字-0。

这里有一个方法:

  • 计算视觉对象相对于根视觉对象 (Visual.TransformToAncestor) 的边界
  • 计算相对于屏幕的视觉范围(本机 GetWindowRect 和 GetClientRect)
  • 枚举所有顶级windows(本机 EnumWindows)
  • 检查每个 windows 是否可见以及是否与视觉对象(本机 GetWindowRect)的边界重叠