我的 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)的边界重叠
我如何知道我的 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)的边界重叠