add Modules.Windows
This commit is contained in:
@@ -1,9 +1,30 @@
|
||||
Imports System.Text
|
||||
Imports System.Drawing
|
||||
Imports System.Runtime.InteropServices
|
||||
Imports System.Text
|
||||
Imports System.Windows.Forms
|
||||
Imports DigitalData.Modules.Logging
|
||||
|
||||
Public Class Window
|
||||
Private _Logger As Logger
|
||||
|
||||
Public Enum Anchor
|
||||
TopLeft
|
||||
BottomLeft
|
||||
TopRight
|
||||
BottomRight
|
||||
End Enum
|
||||
|
||||
Public Class RectangleInfo
|
||||
Public Top As Integer = 0
|
||||
Public Left As Integer = 0
|
||||
Public Right As Integer = 0
|
||||
Public Bottom As Integer = 0
|
||||
|
||||
Public Overrides Function ToString() As String
|
||||
Return String.Format("Top:{0},Left:{1},Bottom:{2},Right:{3}", Top, Left, Bottom, Right)
|
||||
End Function
|
||||
End Class
|
||||
|
||||
Public Class WindowInfo
|
||||
Public WindowTitle As String = ""
|
||||
Public ProcessName As String = ""
|
||||
@@ -14,7 +35,7 @@ Public Class Window
|
||||
End Class
|
||||
|
||||
Public Sub New(LogConfig As LogConfig)
|
||||
_Logger = LogConfig.getLogger()
|
||||
_Logger = LogConfig.GetLogger()
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
@@ -62,20 +83,6 @@ Public Class Window
|
||||
}
|
||||
End Function
|
||||
|
||||
Public Function FocusedControlinActiveWindow(WindowHandle As IntPtr) As IntPtr
|
||||
Try
|
||||
Dim oActiveWindowHandle As IntPtr = NativeMethods.GetForegroundWindow
|
||||
Dim oActiveWindowThread As IntPtr = NativeMethods.GetWindowThreadProcessId(oActiveWindowHandle, 0)
|
||||
Dim oThisWindowThread As IntPtr = NativeMethods.GetWindowThreadProcessId(WindowHandle, 0)
|
||||
NativeMethods.AttachThreadInput(oActiveWindowThread, oThisWindowThread, True)
|
||||
Dim oFocusedControlHandle As IntPtr = NativeMethods.GetFocus()
|
||||
NativeMethods.AttachThreadInput(oActiveWindowThread, oThisWindowThread, False)
|
||||
Return oFocusedControlHandle
|
||||
Catch ex As Exception
|
||||
Return Nothing
|
||||
End Try
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Returns the currently focused control
|
||||
''' </summary>
|
||||
@@ -118,4 +125,144 @@ Public Class Window
|
||||
End Try
|
||||
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Returns Bounds of `ControlHandle`. Relative to `WindowHandle` and `Anchor` value.
|
||||
''' </summary>
|
||||
Public Function GetControlLocation(ControlHandle As IntPtr, WindowHandle As IntPtr, Optional Anchor As Anchor = Anchor.TopLeft) As RectangleInfo
|
||||
Dim oWindowRect As New NativeMethods.RectangleAPI
|
||||
Dim oControlRect As New NativeMethods.RectangleAPI
|
||||
Dim oResult As New RectangleInfo
|
||||
|
||||
Try
|
||||
If NativeMethods.GetWindowRect(New HandleRef(Me, WindowHandle), oWindowRect) = False Then
|
||||
Return Nothing
|
||||
End If
|
||||
|
||||
If NativeMethods.GetWindowRect(New HandleRef(Me, ControlHandle), oControlRect) = False Then
|
||||
Return Nothing
|
||||
End If
|
||||
|
||||
Dim oRect As New NativeMethods.RectangleAPI
|
||||
|
||||
' Calculate Coordinates relative to parent window
|
||||
oRect = GetRelativeRectangle(oControlRect, oWindowRect, Anchor)
|
||||
|
||||
oResult.Left = oRect.Left
|
||||
oResult.Right = oRect.Right
|
||||
oResult.Top = oRect.Top
|
||||
oResult.Bottom = oRect.Bottom
|
||||
|
||||
Return oResult
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
Return Nothing
|
||||
End Try
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Returns Bounds of the focused control. Relative to current form and `Anchor` value.
|
||||
''' </summary>
|
||||
Public Function GetFocusedControlLocation(Optional Anchor As Anchor = Anchor.TopLeft) As RectangleInfo
|
||||
Dim oWindowRect As New NativeMethods.RectangleAPI
|
||||
Dim oControlRect As New NativeMethods.RectangleAPI
|
||||
Dim oForegroundWindow As IntPtr
|
||||
Dim oFocusedControl As IntPtr
|
||||
Dim oResult As New RectangleInfo
|
||||
|
||||
Try
|
||||
oForegroundWindow = NativeMethods.GetForegroundWindow()
|
||||
oFocusedControl = NativeMethods.GetFocus()
|
||||
|
||||
Return GetControlLocation(oFocusedControl, oForegroundWindow, Anchor)
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
Return Nothing
|
||||
End Try
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Returns Bounds of the control under the cursor. Relative to current form and `Anchor` value.
|
||||
''' </summary>
|
||||
Public Function GetHoveredControlLocation(Optional Anchor As Anchor = Anchor.TopLeft) As RectangleInfo
|
||||
Dim oPoint As New NativeMethods.PointAPI
|
||||
Dim oWindowRect As New NativeMethods.RectangleAPI
|
||||
Dim oControlRect As New NativeMethods.RectangleAPI
|
||||
Dim oForegroundWindow As IntPtr
|
||||
Dim oControlUnderCursor As IntPtr
|
||||
Dim oResult As New RectangleInfo
|
||||
|
||||
Try
|
||||
If NativeMethods.GetCursorPos(oPoint) = False Then
|
||||
Return Nothing
|
||||
End If
|
||||
|
||||
oForegroundWindow = NativeMethods.GetForegroundWindow()
|
||||
oControlUnderCursor = NativeMethods.WindowFromPoint(oPoint)
|
||||
|
||||
Return GetControlLocation(oControlUnderCursor, oForegroundWindow, Anchor)
|
||||
Catch ex As Exception
|
||||
_Logger.Error(ex)
|
||||
Return Nothing
|
||||
End Try
|
||||
End Function
|
||||
|
||||
Public Function GetWindowRect(Handle As IntPtr)
|
||||
Dim oWindowRect As New NativeMethods.RectangleAPI
|
||||
|
||||
If NativeMethods.GetWindowRect(New HandleRef(Me, Handle), oWindowRect) = False Then
|
||||
Return Nothing
|
||||
End If
|
||||
|
||||
Return oWindowRect
|
||||
End Function
|
||||
|
||||
Private Function GetRelativeRectangle(ControlRect As NativeMethods.RectangleAPI, WindowRect As NativeMethods.RectangleAPI, Anchor As Anchor) As NativeMethods.RectangleAPI
|
||||
Dim oScreenRect As Rectangle = Screen.PrimaryScreen.Bounds
|
||||
Dim oLeft, oBottom, oTop, oRight As Integer
|
||||
|
||||
Select Case Anchor
|
||||
Case Anchor.TopLeft
|
||||
oLeft = ControlRect.Left - WindowRect.Left
|
||||
oTop = ControlRect.Top - WindowRect.Top
|
||||
Case Anchor.BottomLeft
|
||||
oLeft = ControlRect.Left - WindowRect.Left
|
||||
oBottom = ControlRect.Bottom - WindowRect.Bottom
|
||||
Case Anchor.TopRight
|
||||
oRight = ControlRect.Right - WindowRect.Right
|
||||
oTop = ControlRect.Top - WindowRect.Top
|
||||
Case Anchor.BottomRight
|
||||
oRight = ControlRect.Right - WindowRect.Right
|
||||
oBottom = ControlRect.Bottom - WindowRect.Bottom
|
||||
End Select
|
||||
|
||||
Return New NativeMethods.RectangleAPI() With {
|
||||
.Top = oTop,
|
||||
.Bottom = oBottom,
|
||||
.Left = oLeft,
|
||||
.Right = oRight
|
||||
}
|
||||
End Function
|
||||
|
||||
Private Function GetRect(Rect As NativeMethods.RectangleAPI, ParentRect As NativeMethods.RectangleAPI) As Rectangle
|
||||
Dim oX, oY, oWidth, oHeight As Integer
|
||||
|
||||
oWidth = Rect.Right - Rect.Left
|
||||
oHeight = Rect.Bottom - Rect.Top
|
||||
oX = Rect.Left - ParentRect.Left
|
||||
oY = Rect.Top - ParentRect.Top
|
||||
|
||||
Return New Rectangle(oX, oY, oWidth, oHeight)
|
||||
End Function
|
||||
|
||||
Private Function GetRect(Rect As NativeMethods.RectangleAPI, ParentRect As Rectangle) As Rectangle
|
||||
Dim oX, oY, oWidth, oHeight As Integer
|
||||
|
||||
oWidth = Rect.Right - Rect.Left
|
||||
oHeight = Rect.Bottom - Rect.Top
|
||||
oX = Rect.Left - ParentRect.X
|
||||
oY = Rect.Top - ParentRect.Y
|
||||
|
||||
Return New Rectangle(oX, oY, oWidth, oHeight)
|
||||
End Function
|
||||
End Class
|
||||
|
||||
Reference in New Issue
Block a user