mirror of
https://github.com/TheUltimateHacker/ShiftOS.git
synced 2025-01-22 16:12:14 +00:00
1127 lines
No EOL
45 KiB
VB.net
1127 lines
No EOL
45 KiB
VB.net
Public Class Window
|
|
|
|
#Region "NATIVE"
|
|
Private Enum GW
|
|
NONE = -1
|
|
HWNDFIRST = 0
|
|
HWNDLAST = 1
|
|
HWNDNEXT = 2
|
|
HWNDPREV = 3
|
|
OWNER = 4
|
|
CHILD = 5
|
|
ENABLEDPOPUP = 6
|
|
End Enum
|
|
Private Declare Function GetWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal uCmd As GW) As IntPtr
|
|
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Integer
|
|
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer
|
|
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String) As Boolean
|
|
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Integer, ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
|
|
Private Declare Function GetParent Lib "user32" (ByVal hWnd As IntPtr) As IntPtr
|
|
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer
|
|
Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As System.Runtime.InteropServices.HandleRef, ByRef lpRect As API.WRECT) As Boolean
|
|
Private Declare Function GetClientRect Lib "user32" (ByVal hWnd As System.Runtime.InteropServices.HandleRef, ByRef lpRect As API.WRECT) As Boolean
|
|
Private Enum SWP As UInteger
|
|
''' <summary>If the calling thread and the thread that owns the window are attached to different input queues,
|
|
''' the system posts the request to the thread that owns the window. This prevents the calling thread from
|
|
''' blocking its execution while other threads process the request.</summary>
|
|
''' <remarks>SWP_ASYNCWINDOWPOS</remarks>
|
|
SynchronousWindowPosition = &H4000
|
|
''' <summary>Prevents generation of the WM_SYNCPAINT message.</summary>
|
|
''' <remarks>SWP_DEFERERASE</remarks>
|
|
DeferErase = &H2000
|
|
''' <summary>Draws a frame (defined in the window's class description) around the window.</summary>
|
|
''' <remarks>SWP_DRAWFRAME</remarks>
|
|
DrawFrame = &H20
|
|
''' <summary>Applies new frame styles set using the SetWindowLong function. Sends a WM_NCCALCSIZE message to
|
|
''' the window, even if the window's size is not being changed. If this flag is not specified, WM_NCCALCSIZE
|
|
''' is sent only when the window's size is being changed.</summary>
|
|
''' <remarks>SWP_FRAMECHANGED</remarks>
|
|
FrameChanged = &H20
|
|
''' <summary>Hides the window.</summary>
|
|
''' <remarks>SWP_HIDEWINDOW</remarks>
|
|
HideWindow = &H80
|
|
''' <summary>Does not activate the window. If this flag is not set, the window is activated and moved to the
|
|
''' top of either the topmost or non-topmost group (depending on the setting of the hWndInsertAfter
|
|
''' parameter).</summary>
|
|
''' <remarks>SWP_NOACTIVATE</remarks>
|
|
DoNotActivate = &H10
|
|
''' <summary>Discards the entire contents of the client area. If this flag is not specified, the valid
|
|
''' contents of the client area are saved and copied back into the client area after the window is sized or
|
|
''' repositioned.</summary>
|
|
''' <remarks>SWP_NOCOPYBITS</remarks>
|
|
DoNotCopyBits = &H100
|
|
''' <summary>Retains the current position (ignores X and Y parameters).</summary>
|
|
''' <remarks>SWP_NOMOVE</remarks>
|
|
IgnoreMove = &H2
|
|
''' <summary>Does not change the owner window's position in the Z order.</summary>
|
|
''' <remarks>SWP_NOOWNERZORDER</remarks>
|
|
DoNotChangeOwnerZOrder = &H200
|
|
''' <summary>Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to
|
|
''' the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent
|
|
''' window uncovered as a result of the window being moved. When this flag is set, the application must
|
|
''' explicitly invalidate or redraw any parts of the window and parent window that need redrawing.</summary>
|
|
''' <remarks>SWP_NOREDRAW</remarks>
|
|
DoNotRedraw = &H8
|
|
''' <summary>Same as the SWP_NOOWNERZORDER flag.</summary>
|
|
''' <remarks>SWP_NOREPOSITION</remarks>
|
|
DoNotReposition = &H200
|
|
''' <summary>Prevents the window from receiving the WM_WINDOWPOSCHANGING message.</summary>
|
|
''' <remarks>SWP_NOSENDCHANGING</remarks>
|
|
DoNotSendChangingEvent = &H400
|
|
''' <summary>Retains the current size (ignores the cx and cy parameters).</summary>
|
|
''' <remarks>SWP_NOSIZE</remarks>
|
|
IgnoreResize = &H1
|
|
''' <summary>Retains the current Z order (ignores the hWndInsertAfter parameter).</summary>
|
|
''' <remarks>SWP_NOZORDER</remarks>
|
|
IgnoreZOrder = &H4
|
|
''' <summary>Displays the window.</summary>
|
|
''' <remarks>SWP_SHOWWINDOW</remarks>
|
|
ShowWindow = &H40
|
|
End Enum
|
|
Private Enum HWNDafter As Integer
|
|
BOTTOM = 1
|
|
NOTOPMOST = -2
|
|
TOP = 0
|
|
TOPMOST = -1
|
|
End Enum
|
|
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As IntPtr, ByVal hWndInsertAfter As HWNDafter, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As SWP) As Boolean
|
|
|
|
Private Declare Function IsWindow Lib "user32" (ByVal hWnd As IntPtr) As Boolean
|
|
Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As IntPtr) As Boolean
|
|
Private Declare Function AnimateWindow Lib "user32" (ByVal hwnd As IntPtr, ByVal time As Integer, ByVal flags As AnimateFlags) As Boolean
|
|
Private Declare Function RedrawWindow Lib "user32" (ByVal hWnd As IntPtr, ByVal lprcUpdate As IntPtr, ByVal hrgnUpdate As IntPtr, ByVal flags As RedrawFlags) As Boolean
|
|
Private Declare Function FlashWindow Lib "user32" (ByVal hWnd As IntPtr, ByVal bInvert As Boolean) As Boolean
|
|
Private Declare Function PrintWindow Lib "user32" (ByVal hwnd As IntPtr, ByVal hDC As IntPtr, ByVal nFlags As UInteger) As Boolean
|
|
Private Declare Function GetDC Lib "user32" (ByVal hwnd As IntPtr) As IntPtr
|
|
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As IntPtr) As IntPtr
|
|
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As IntPtr, ByRef lpPoint As Point) As Boolean
|
|
Private Declare Function ClientToScreen Lib "user32" (ByVal hWnd As IntPtr, ByRef lpPoint As Point) As Boolean
|
|
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As IntPtr) As IntPtr
|
|
Private Declare Function ReleaseCapture Lib "user32" () As IntPtr
|
|
Private Declare Function GetCapture Lib "user32" () As IntPtr
|
|
|
|
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
|
|
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal className As String, ByVal windowTitle As IntPtr) As IntPtr
|
|
Private Declare Function WindowFromPoint Lib "user32" (ByVal Point As API.WPOINT) As IntPtr
|
|
Private Declare Function ChildWindowFromPoint Lib "user32" (ByVal hWndParent As IntPtr, ByVal point As API.WPOINT) As IntPtr
|
|
Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr
|
|
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As IntPtr) As Boolean
|
|
Private Declare Function GetDesktopWindow Lib "user32" () As IntPtr
|
|
Private Declare Function GetTopWindow Lib "user32" (ByVal hwnd As IntPtr) As IntPtr
|
|
Private Declare Function GetFocus Lib "user32" () As IntPtr
|
|
Private Declare Function GetActiveWindow Lib "user32.dll" () As IntPtr
|
|
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer
|
|
|
|
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr
|
|
Private Declare Function GetMenu Lib "user32" (ByVal hWnd As IntPtr) As IntPtr
|
|
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As IntPtr, ByVal nPos As Integer) As IntPtr
|
|
|
|
Private Enum GWL As Integer
|
|
WNDPROC = -4
|
|
HINSTANCE = -6
|
|
HWNDPARENT = -8
|
|
STYLE = -16
|
|
EXSTYLE = -20
|
|
USERDATA = -21
|
|
ID = -12
|
|
End Enum
|
|
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As IntPtr, ByVal nIndex As GWL, ByVal dwNewLong As Long) As Integer
|
|
<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetWindowLong")> _
|
|
Private Shared Function GetWindowLongPtr32(ByVal hWnd As Runtime.InteropServices.HandleRef, ByVal nIndex As Integer) As Long
|
|
End Function
|
|
<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetWindowLongPtr")> _
|
|
Private Shared Function GetWindowLongPtr64(ByVal hWnd As Runtime.InteropServices.HandleRef, ByVal nIndex As Integer) As Long
|
|
End Function
|
|
Private Shared Function GetWindowLong(ByVal hwnd As Runtime.InteropServices.HandleRef, ByVal nIndex As GWL) As Long
|
|
If IntPtr.Size = 8 Then
|
|
Return GetWindowLongPtr64(hwnd, nIndex)
|
|
Else
|
|
Return GetWindowLongPtr32(hwnd, nIndex)
|
|
End If
|
|
End Function
|
|
|
|
Private Structure LayeredWindowAttributes
|
|
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As IntPtr, ByVal crKey As Integer, ByVal alpha As Byte, ByVal dwFlags As LWA) As Boolean
|
|
Private Declare Function GetLayeredWindowAttributes Lib "user32" (ByVal hWnd As IntPtr, ByRef crKey As Integer, ByRef alpha As Byte, ByRef dwFlags As LWA) As Boolean
|
|
Public Sub New(ByVal hwnd As IntPtr)
|
|
Me.hwnd = hwnd
|
|
GetLayeredWindowAttributes(Me.hwnd, Me.crKey, Me.alpha, Me.dwFlags)
|
|
End Sub
|
|
Private hwnd As IntPtr
|
|
Public crKey As Integer
|
|
Public alpha As Byte
|
|
Private dwFlags As LWA
|
|
Private Enum LWA As Integer
|
|
ColorKey = &H1
|
|
Alpha = &H2
|
|
End Enum
|
|
Public Property UseColorKey() As Boolean
|
|
Get
|
|
Return (Me.dwFlags And LWA.ColorKey) = LWA.ColorKey
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
If (Me.dwFlags And LWA.ColorKey) = LWA.ColorKey <> value Then
|
|
If value = True Then Me.dwFlags += LWA.ColorKey Else Me.dwFlags -= LWA.ColorKey
|
|
End If
|
|
End Set
|
|
End Property
|
|
Public Property UseAlpha() As Boolean
|
|
Get
|
|
Return (Me.dwFlags And LWA.Alpha) = LWA.Alpha
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
If (Me.dwFlags And LWA.Alpha) = LWA.Alpha <> value Then
|
|
If value = True Then Me.dwFlags += LWA.Alpha Else Me.dwFlags -= LWA.Alpha
|
|
End If
|
|
End Set
|
|
End Property
|
|
Public Function Apply() As Boolean
|
|
Return SetLayeredWindowAttributes(Me.hwnd, Me.crKey, Me.alpha, Me.dwFlags)
|
|
End Function
|
|
End Structure
|
|
|
|
Private Structure WindowPlacement
|
|
Private Declare Function SetWindowPlacement Lib "user32" (ByVal hWnd As IntPtr, ByRef lpwndpl As WindowPlacement) As Boolean
|
|
Private Declare Function GetWindowPlacement Lib "user32" (ByVal hWnd As IntPtr, ByRef lpwndpl As WindowPlacement) As Boolean
|
|
Sub New(ByVal hWnd As IntPtr)
|
|
Me.length = System.Runtime.InteropServices.Marshal.SizeOf(Me)
|
|
GetWindowPlacement(hWnd, Me)
|
|
End Sub
|
|
Public Function Send(ByVal hWnd As IntPtr) As Boolean
|
|
Return SetWindowPlacement(hWnd, Me)
|
|
End Function
|
|
Public length As Integer
|
|
Public flags As WPF
|
|
Public showCmd As State
|
|
Public minimizedPosition As API.WPOINT
|
|
Public maximizedPosition As API.WPOINT
|
|
Public normalPosition As API.WRECT
|
|
Public Enum WPF As Integer
|
|
ASyncWindowPlacement = 4
|
|
RestoreToMaximized = 2
|
|
SetMinimizedPosition = 1
|
|
End Enum
|
|
End Structure
|
|
Private Class Enumerator
|
|
Private Delegate Function EnumCallBackDelegate(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer
|
|
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As EnumCallBackDelegate, ByVal lParam As Integer) As Integer
|
|
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Integer, ByVal lpEnumFunc As EnumCallBackDelegate, ByVal lParam As Integer) As Integer
|
|
Private Declare Function EnumThreadWindows Lib "user32" (ByVal dwThreadId As UInteger, ByVal lpfn As EnumCallBackDelegate, ByVal lParam As Integer) As Boolean
|
|
Private Declare Function EnumDesktopWindows Lib "user32" (ByVal hDesktop As IntPtr, ByVal lpfn As EnumCallBackDelegate, ByVal lparam As Integer) As Boolean
|
|
|
|
Private Function EnumProc(ByVal hwnd As Int32, ByVal lParam As Int32) As Int32
|
|
If lParam = 1 AndAlso GetParent(hwnd) = 0 AndAlso IsWindowVisible(hwnd) Then _list.Add(hwnd) 'toplevel
|
|
If lParam = 2 Then _list.Add(hwnd) 'childwindows
|
|
If lParam = 3 Then _list.Add(hwnd) 'threadwindows
|
|
If lParam = 4 Then _list.Add(hwnd) 'desktopwindows
|
|
Return 1
|
|
End Function
|
|
|
|
Private _list As List(Of IntPtr)
|
|
Public Function GetTopLevelWindows() As List(Of IntPtr)
|
|
_list = New List(Of IntPtr)
|
|
EnumWindows(AddressOf EnumProc, 1)
|
|
Return _list
|
|
End Function
|
|
Public Function GetChildWindows(ByVal hwnd As Int32) As List(Of IntPtr)
|
|
_list = New List(Of IntPtr)
|
|
EnumChildWindows(hwnd, AddressOf EnumProc, 2)
|
|
Return _list
|
|
End Function
|
|
Public Function GetThreadWindows(ByVal threadID As Integer) As List(Of IntPtr)
|
|
_list = New List(Of IntPtr)
|
|
EnumThreadWindows(threadID, AddressOf EnumProc, 3)
|
|
Return _list
|
|
End Function
|
|
Public Function GetDesktopWindows(ByVal desktop As IntPtr) As List(Of IntPtr)
|
|
_list = New List(Of IntPtr)
|
|
EnumDesktopWindows(desktop, AddressOf EnumProc, 4)
|
|
Return _list
|
|
End Function
|
|
End Class
|
|
|
|
Public Structure KeyCommand
|
|
Sub New(ByVal Key As Keys, ByVal EventType As KeyEvent)
|
|
Dim Up As Boolean = EventType = KeyEvent.Up
|
|
Dim Alt As Boolean = (Key And Keys.Alt) = Keys.Alt
|
|
Dim F10 As Boolean = (Key And Keys.F10) = Keys.F10
|
|
If Alt Or F10 Then EventType += 4 'offset to sys_
|
|
|
|
Me.Key = Key
|
|
Me.EventType = EventType
|
|
Me.Flags = EventFlag.None
|
|
If Up Then Me.Flags = EventFlag.PrevWasDown
|
|
If Up And Not Alt And Not F10 Then Me.Flags += EventFlag.Transition
|
|
If Alt And Not Up Then Me.Flags += EventFlag.AltKeyDown
|
|
|
|
Dim extended As Boolean = False
|
|
If Key = Keys.LControlKey Or Key = Keys.RControlKey Then extended = True
|
|
If Key = Keys.LShiftKey Or Key = Keys.RShiftKey Then extended = True
|
|
If Key = Keys.LMenu Or Key = Keys.RMenu Then extended = True
|
|
If extended Then Me.Flags += EventFlag.ExtendedKey
|
|
Me.RepeatCount = 0
|
|
Me.scancode = 0
|
|
End Sub
|
|
Sub New(ByVal Character As Char)
|
|
Me.Key = Asc(Character)
|
|
Me.EventType = KeyEvent.CharPress
|
|
Me.Flags = EventFlag.None
|
|
End Sub
|
|
Public EventType As KeyEvent
|
|
Public Key As Keys
|
|
Public RepeatCount As UShort
|
|
Public scancode As Byte
|
|
Public Flags As Byte
|
|
Public Enum EventFlag As Byte
|
|
None = 0
|
|
ExtendedKey = 1
|
|
AltKeyDown = 32
|
|
PrevWasDown = 64
|
|
Transition = 128
|
|
End Enum
|
|
Public Function Post(ByVal hwnd As IntPtr) As Boolean
|
|
Return API.PostMessage(hwnd, EventType, Key, API.DWORD.FromSBB(Me.RepeatCount, Me.scancode, Me.Flags))
|
|
End Function
|
|
End Structure
|
|
Public Structure MouseCommand
|
|
Sub New(ByVal X As UShort, ByVal Y As UShort, Optional ByVal Button As MouseButtons = MouseButtons.None, Optional ByVal EventType As MouseEvent = MouseEvent.Move)
|
|
Me.EventType = EventType
|
|
Me.Button = Button
|
|
Me.Modifier = MK.NONE
|
|
Me.x = X
|
|
Me.y = Y
|
|
End Sub
|
|
Sub New(ByVal Location As Point, Optional ByVal Button As MouseButtons = MouseButtons.None, Optional ByVal EventType As MouseEvent = MouseEvent.Move)
|
|
Me.EventType = EventType
|
|
Me.Button = Button
|
|
Me.Modifier = MK.NONE
|
|
Me.x = Location.X
|
|
Me.y = Location.Y
|
|
End Sub
|
|
Public EventType As MouseEvent
|
|
Public Button As MouseButtons
|
|
Public x As UShort
|
|
Public y As UShort
|
|
Public Modifier As MK
|
|
Public Function Post(ByVal hwnd As IntPtr) As Boolean
|
|
Dim msg1 As msg = 0
|
|
Dim msg2 As msg = 0
|
|
Dim add As Boolean = EventType >= 0 And EventType <= 2
|
|
Select Case Button
|
|
Case MouseButtons.Left
|
|
msg1 = msg.LBUTTONDOWN
|
|
Case MouseButtons.Middle
|
|
msg1 = msg.MBUTTONDOWN
|
|
Case MouseButtons.Right
|
|
msg1 = msg.RBUTTONDOWN
|
|
Case Else
|
|
add = False
|
|
msg1 = msg.MOUSEMOVE
|
|
End Select
|
|
If EventType = MouseEvent.DoubleClick Then
|
|
msg2 = msg1 + MouseEvent.Up
|
|
msg1 = msg1 + MouseEvent.DoubleClick
|
|
ElseIf EventType = MouseEvent.Click Then
|
|
msg2 = msg1 + MouseEvent.Up
|
|
msg1 = msg1 + MouseEvent.Down
|
|
ElseIf add Then
|
|
msg1 += EventType
|
|
End If
|
|
|
|
Dim success As Boolean = True
|
|
If msg1 <> 0 AndAlso Not API.PostMessage(hwnd, msg1, Modifier, New API.DWORD(Me.x, Me.y)) Then success = False
|
|
If msg2 <> 0 AndAlso Not API.PostMessage(hwnd, msg2, Modifier, New API.DWORD(Me.x, Me.y)) Then success = False
|
|
Return success
|
|
End Function
|
|
Public Enum MK As Integer
|
|
'No keys are down
|
|
NONE = &H0
|
|
'The CTRL key is down.
|
|
CONTROL = &H8
|
|
'The left mouse button is down.
|
|
LBUTTON = &H1
|
|
'The middle mouse button is down.
|
|
MBUTTON = &H10
|
|
'The right mouse button is down.
|
|
RBUTTON = &H2
|
|
'The SHIFT key is down.
|
|
SHIFT = &H4
|
|
'The first X button is down.
|
|
XBUTTON1 = &H20
|
|
'The second X button is down.
|
|
XBUTTON2 = &H40
|
|
End Enum
|
|
|
|
Private Enum msg As UInteger
|
|
MOUSEACTIVATE = &H21
|
|
MOUSEMOVE = &H200
|
|
LBUTTONDOWN = 513
|
|
LBUTTONUP = 514
|
|
LBUTTONDBLCLK = 515
|
|
RBUTTONDOWN = 516
|
|
RBUTTONUP = 517
|
|
RBUTTONDBLCLK = 518
|
|
MBUTTONDOWN = 519
|
|
MBUTTONUP = 520
|
|
MBUTTONDBLCLK = 521
|
|
End Enum
|
|
End Structure
|
|
#End Region
|
|
|
|
Public Enum KeyEvent
|
|
Down = &H100
|
|
Up = &H101
|
|
CharPress = &H102
|
|
End Enum
|
|
Public Enum MouseEvent
|
|
Down = 0
|
|
Up = 1
|
|
DoubleClick = 2
|
|
Click = 3
|
|
Move = 4
|
|
End Enum
|
|
Public Enum RedrawFlags As UInteger
|
|
''' <summary>
|
|
''' Invalidates the rectangle or region that you specify in lprcUpdate or hrgnUpdate.
|
|
''' You can set only one of these parameters to a non-NULL value. If both are NULL, RDW_INVALIDATE invalidates the entire window.
|
|
''' </summary>
|
|
Invalidate = &H1
|
|
''' <summary>Causes the OS to post a WM_PAINT message to the window regardless of whether a portion of the window is invalid.</summary>
|
|
InternalPaint = &H2
|
|
''' <summary>
|
|
''' Causes the window to receive a WM_ERASEBKGND message when the window is repainted.
|
|
''' Specify this value in combination with the RDW_INVALIDATE value; otherwise, RDW_ERASE has no effect.
|
|
''' </summary>
|
|
[Erase] = &H4
|
|
''' <summary>
|
|
''' Validates the rectangle or region that you specify in lprcUpdate or hrgnUpdate.
|
|
''' You can set only one of these parameters to a non-NULL value. If both are NULL, RDW_VALIDATE validates the entire window.
|
|
''' This value does not affect internal WM_PAINT messages.
|
|
''' </summary>
|
|
Validate = &H8
|
|
NoInternalPaint = &H10
|
|
''' <summary>Suppresses any pending WM_ERASEBKGND messages.</summary>
|
|
NoErase = &H20
|
|
''' <summary>Excludes child windows, if any, from the repainting operation.</summary>
|
|
NoChildren = &H40
|
|
''' <summary>Includes child windows, if any, in the repainting operation.</summary>
|
|
AllChildren = &H80
|
|
''' <summary>Causes the affected windows, which you specify by setting the RDW_ALLCHILDREN and RDW_NOCHILDREN values, to receive WM_ERASEBKGND and WM_PAINT messages before the RedrawWindow returns, if necessary.</summary>
|
|
UpdateNow = &H100
|
|
''' <summary>
|
|
''' Causes the affected windows, which you specify by setting the RDW_ALLCHILDREN and RDW_NOCHILDREN values, to receive WM_ERASEBKGND messages before RedrawWindow returns, if necessary.
|
|
''' The affected windows receive WM_PAINT messages at the ordinary time.
|
|
''' </summary>
|
|
EraseNow = &H200
|
|
Frame = &H400
|
|
NoFrame = &H800
|
|
End Enum
|
|
Public Enum AnimateFlags
|
|
HOR_POSITIVE = &H1
|
|
HOR_NEGATIVE = &H2
|
|
VER_POSITIVE = &H4
|
|
VER_NEGATIVE = &H8
|
|
CENTER = &H10
|
|
HIDE = &H10000
|
|
ACTIVATE = &H20000
|
|
SLIDE = &H40000
|
|
BLEND = &H80000
|
|
End Enum
|
|
Public Enum State
|
|
Hidden = 0
|
|
Normal = 1
|
|
Minimized = 2
|
|
Maximized = 3
|
|
Shown = 5
|
|
End Enum
|
|
Public Enum Styles As Long
|
|
ControlBox = &H80000L
|
|
MinimizeBox = &H20000L
|
|
MaximizeBox = &H10000L
|
|
Sizable = ThickFrame
|
|
Border = &H800000L
|
|
Caption = &HC00000L
|
|
Visible = &H10000000L
|
|
Disabled = &H8000000L
|
|
Child = &H40000000L
|
|
VScrollBar = &H200000L
|
|
HScrollBar = &H100000L
|
|
TabStop = &H10000L
|
|
Group = &H20000L
|
|
ClipSiblings = &H4000000L
|
|
ClipChildren = &H2000000L
|
|
ThickFrame = &H40000L
|
|
DialogFrame = &H400000L
|
|
|
|
'initial start state
|
|
Minimize = &H20000000L
|
|
Maximize = &H1000000L
|
|
|
|
Overlapped = &H0L
|
|
Tiled = Overlapped
|
|
OverlappedWindow = (Overlapped Or Caption Or Styles.ControlBox Or ThickFrame Or MinimizeBox Or MaximizeBox)
|
|
TiledWindow = OverlappedWindow
|
|
|
|
PopUp = &H80000000L
|
|
PopUpWindow = (PopUp Or Border Or Styles.ControlBox)
|
|
End Enum
|
|
Public Enum ExStyles As Long
|
|
AllowDrop = &H10L
|
|
TopMost = &H8L
|
|
Layered = &H80000
|
|
Composited = &H2000000L
|
|
NoActivate = &H8000000L
|
|
NoInheritLayout = &H100000L
|
|
NoParentNotify = &H4L
|
|
ToolWindow = &H80L
|
|
MDIChild = &H40L
|
|
Transparent = &H20L
|
|
WindowEdge = &H100L
|
|
ClientEdge = &H200L
|
|
HelpButton = &H400L
|
|
RightToLeft = &H400000L
|
|
DialogModalFrame = &H1L
|
|
End Enum
|
|
|
|
Public Enum CMD
|
|
Close = 0
|
|
Destroy = 1
|
|
BringToFront = 2
|
|
SendToBack = 3
|
|
Show = 4
|
|
Hide = 5
|
|
Flash = 6
|
|
Focus = 7
|
|
Clear = 8
|
|
Undo = 9
|
|
Copy = 10
|
|
Paste = 11
|
|
Cut = 12
|
|
End Enum
|
|
|
|
Private hwnd As IntPtr
|
|
Sub New()
|
|
Me.hwnd = IntPtr.Zero
|
|
End Sub
|
|
Sub New(ByVal hWnd As IntPtr)
|
|
Me.hwnd = hWnd
|
|
End Sub
|
|
Sub New(ByVal c As Control)
|
|
Me.hwnd = c.Handle
|
|
End Sub
|
|
Sub New(ByVal WindowName As String, Optional ByVal ClassName As String = Nothing)
|
|
Me.hwnd = FindWindow(ClassName, WindowName)
|
|
End Sub
|
|
Sub New(ByVal p As Process, Optional ByVal UseMainHandle As Boolean = True)
|
|
If UseMainHandle Then Me.hwnd = p.MainWindowHandle Else Me.hwnd = p.Handle
|
|
End Sub
|
|
|
|
Public Property Handle() As IntPtr
|
|
Get
|
|
Return Me.hwnd
|
|
End Get
|
|
Set(ByVal value As IntPtr)
|
|
Me.hwnd = value
|
|
End Set
|
|
End Property
|
|
Public Property HandleRef() As Runtime.InteropServices.HandleRef
|
|
Get
|
|
Return New Runtime.InteropServices.HandleRef(Me, Me.hwnd)
|
|
End Get
|
|
Set(ByVal value As Runtime.InteropServices.HandleRef)
|
|
Me.hwnd = value.Handle
|
|
End Set
|
|
End Property
|
|
|
|
Public Function GetDC() As API.DC
|
|
Return New API.DC(Me.hwnd, GetDC(Me.hwnd))
|
|
End Function
|
|
Public Function GetWindowDC() As API.DC
|
|
Return New API.DC(Me.hwnd, GetWindowDC(Me.hwnd))
|
|
End Function
|
|
|
|
Public Property Text() As String
|
|
Get
|
|
Return API.WM.TEXT(Me.hwnd)
|
|
End Get
|
|
Set(ByVal value As String)
|
|
API.WM.TEXT(Me.hwnd) = value
|
|
End Set
|
|
End Property
|
|
Public Property Name() As String
|
|
Get
|
|
Dim length As Integer = GetWindowTextLength(Me.hwnd) + 1
|
|
Dim s As New System.Text.StringBuilder(length)
|
|
GetWindowText(Me.hwnd, s, s.Capacity)
|
|
Return s.ToString
|
|
End Get
|
|
Set(ByVal value As String)
|
|
SetWindowText(Me.hwnd, value)
|
|
End Set
|
|
End Property
|
|
Public Property Bounds() As Rectangle
|
|
Get
|
|
Dim r As API.WRECT
|
|
If (GetWindowRect(Me.HandleRef, r)) Then
|
|
Return r.Value
|
|
Else
|
|
Return Nothing
|
|
End If
|
|
End Get
|
|
Set(ByVal value As Rectangle)
|
|
SetWindowPos(Me.hwnd, -2, value.X, value.Y, value.Width, value.Height, SWP.IgnoreZOrder)
|
|
End Set
|
|
End Property
|
|
Public ReadOnly Property ClientSize() As Size
|
|
Get
|
|
Dim r As API.WRECT
|
|
GetClientRect(Me.HandleRef, r)
|
|
Return r.Value.Size
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property ClientRectangle() As Rectangle
|
|
Get
|
|
Return New Rectangle(ClientToScreen(New Point(0, 0)), ClientSize)
|
|
End Get
|
|
End Property
|
|
Public Property Location() As Point
|
|
Get
|
|
Return Bounds.Location
|
|
End Get
|
|
Set(ByVal value As Point)
|
|
SetWindowPos(Me.hwnd, -2, value.X, value.Y, 0, 0, SWP.IgnoreResize Or SWP.IgnoreZOrder)
|
|
End Set
|
|
End Property
|
|
Public Property Size() As Size
|
|
Get
|
|
Return Bounds.Size
|
|
End Get
|
|
Set(ByVal value As Size)
|
|
SetWindowPos(Me.hwnd, -2, 0, 0, value.Width, value.Height, SWP.IgnoreMove Or SWP.IgnoreZOrder)
|
|
End Set
|
|
End Property
|
|
Public Property WindowState() As State
|
|
Get
|
|
Return New WindowPlacement(Me.hwnd).showCmd
|
|
End Get
|
|
Set(ByVal value As State)
|
|
Dim d As New WindowPlacement(Me.hwnd)
|
|
d.showCmd = value
|
|
d.Send(Me.hwnd)
|
|
End Set
|
|
End Property
|
|
Public ReadOnly Property Exists()
|
|
Get
|
|
Return IsWindow(Me.hwnd)
|
|
End Get
|
|
End Property
|
|
Public Property Visible() As Boolean
|
|
Get
|
|
Return IsWindowVisible(Me.hwnd)
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
If value = False Then Command(CMD.Hide)
|
|
If value = True Then Command(CMD.Show)
|
|
End Set
|
|
End Property
|
|
Public Property Font() As Font
|
|
Get
|
|
Return API.WM.FONT(Me.hwnd)
|
|
End Get
|
|
Set(ByVal value As Font)
|
|
API.WM.FONT(Me.hwnd) = value
|
|
End Set
|
|
End Property
|
|
Public Property Enabled() As Boolean
|
|
Get
|
|
Return Me.Style(Styles.Disabled) = False
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
Me.Style(Styles.Disabled) = value = False
|
|
End Set
|
|
End Property
|
|
Public Property Focused() As Boolean
|
|
Get
|
|
Return GetFocus = Me.hwnd
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
If value Then
|
|
API.WM.SETFOCUS(Me.hwnd)
|
|
Else
|
|
API.WM.KILLFOCUS(Me.hwnd)
|
|
End If
|
|
End Set
|
|
End Property
|
|
Public Property Captured() As Boolean
|
|
Get
|
|
Return GetCapture() = Me.hwnd
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
If value Then
|
|
SetCapture(Me.hwnd)
|
|
ElseIf Me.Captured Then
|
|
ReleaseCapture()
|
|
End If
|
|
End Set
|
|
End Property
|
|
|
|
Public Function ScreenToClient(ByVal p As Point) As Point
|
|
ScreenToClient(Me.hwnd, p)
|
|
Return p
|
|
End Function
|
|
Public Function ScreenToClient(ByVal r As Rectangle) As Rectangle
|
|
Return New Rectangle(ScreenToClient(r.Location), r.Size)
|
|
End Function
|
|
Public Function ClientToScreen(ByVal p As Point) As Point
|
|
ClientToScreen(Me.hwnd, p)
|
|
Return p
|
|
End Function
|
|
Public Function ClientToScreen(ByVal r As Rectangle) As Rectangle
|
|
Return New Rectangle(ClientToScreen(r.Location), r.Size)
|
|
End Function
|
|
|
|
Public Sub Animate(ByVal flags As AnimateFlags, Optional ByVal Time As Integer = 1000)
|
|
AnimateWindow(Me.hwnd, Time, flags)
|
|
End Sub
|
|
Public Sub Invalidate()
|
|
Redraw(RedrawFlags.Invalidate Or RedrawFlags.UpdateNow)
|
|
End Sub
|
|
Public Sub Redraw(ByVal flags As RedrawFlags)
|
|
RedrawWindow(Me.hwnd, Nothing, Nothing, flags)
|
|
End Sub
|
|
Public Function CreateGraphics() As Graphics
|
|
Return Graphics.FromHwnd(Me.hwnd)
|
|
End Function
|
|
|
|
Public Sub CaptureClient(ByVal g As Graphics, ByVal srcrect As Rectangle, Optional ByVal DestX As Integer = 0, Optional ByVal DestY As Integer = 0)
|
|
Dim gdc As New API.DC(g)
|
|
Dim hdc As API.DC = Me.GetDC
|
|
hdc.CopyTo(gdc)
|
|
gdc.Dispose()
|
|
hdc.Dispose()
|
|
End Sub
|
|
Public Function CaptureClient() As Image
|
|
Return CaptureClient(New Rectangle(New Point(), Me.ClientSize))
|
|
End Function
|
|
Public Function CaptureClient(ByVal rect As Rectangle) As Image
|
|
If rect.Width < 1 Or rect.Height < 1 Then Return Nothing
|
|
Dim img As New Bitmap(rect.Width, rect.Height)
|
|
Dim g As Graphics = Graphics.FromImage(img)
|
|
CaptureClient(g, rect)
|
|
g.Dispose()
|
|
Return img
|
|
End Function
|
|
Public Sub CaptureWindow(ByVal g As Graphics)
|
|
'Dim Hdc As IntPtr = g.GetHdc()
|
|
'PrintWindow(Me.hwnd, Hdc, 0)
|
|
'g.ReleaseHdc(Hdc)
|
|
|
|
Dim gdc As New API.DC(g)
|
|
Dim hdc As API.DC = Me.GetWindowDC
|
|
hdc.CopyTo(gdc)
|
|
gdc.Dispose()
|
|
hdc.Dispose()
|
|
End Sub
|
|
Public Function CaptureWindow() As Image
|
|
Dim s As Size = Me.Size
|
|
If s.Width < 1 Or s.Height < 1 Then Return Nothing
|
|
Dim img As New Bitmap(s.Width, s.Height)
|
|
Dim g As Graphics = Graphics.FromImage(img)
|
|
CaptureWindow(g)
|
|
g.Dispose()
|
|
Return img
|
|
End Function
|
|
|
|
Public Property Opacity(Optional ByVal SetLayered As Boolean = True) As Byte
|
|
Get
|
|
If SetLayered Then Me.ExStyle(ExStyles.Layered) = True
|
|
Dim lwa As New LayeredWindowAttributes(Me.hwnd)
|
|
If lwa.UseAlpha = False Then Return 255
|
|
Return lwa.alpha
|
|
End Get
|
|
Set(ByVal value As Byte)
|
|
If SetLayered Then Me.ExStyle(ExStyles.Layered) = True
|
|
Dim lwa As New LayeredWindowAttributes(Me.hwnd)
|
|
If value = 255 Then
|
|
lwa.UseAlpha = False
|
|
Else
|
|
lwa.UseAlpha = True
|
|
lwa.alpha = value
|
|
End If
|
|
lwa.Apply()
|
|
End Set
|
|
End Property
|
|
Public Property TransparencyKey(Optional ByVal SetLayered As Boolean = True) As Color
|
|
Get
|
|
If SetLayered Then Me.ExStyle(ExStyles.Layered) = True
|
|
Return ColorTranslator.FromOle(New LayeredWindowAttributes(Me.hwnd).crKey)
|
|
End Get
|
|
Set(ByVal value As Color)
|
|
If SetLayered Then Me.ExStyle(ExStyles.Layered) = True
|
|
Dim lwa As New LayeredWindowAttributes(Me.hwnd)
|
|
If IsNothing(value) Then
|
|
lwa.UseColorKey = False
|
|
Else
|
|
lwa.UseColorKey = True
|
|
lwa.crKey = value.ToArgb
|
|
End If
|
|
lwa.Apply()
|
|
End Set
|
|
End Property
|
|
|
|
Public Property ExStyle(ByVal ex As ExStyles) As Boolean
|
|
Get
|
|
Return (Me.ExStyle And ex) = ex
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
Dim exs As ExStyles = Me.ExStyle
|
|
If (exs And ex) = ex <> value Then
|
|
If value = True Then exs += ex Else exs -= ex
|
|
Me.ExStyle = exs
|
|
End If
|
|
End Set
|
|
End Property
|
|
Public Property ExStyle() As ExStyles
|
|
Get
|
|
Return GetWindowLong(Me.HandleRef, GWL.EXSTYLE)
|
|
End Get
|
|
Set(ByVal value As ExStyles)
|
|
SetWindowLong(Me.hwnd, GWL.EXSTYLE, value)
|
|
End Set
|
|
End Property
|
|
Public Property Style(ByVal st As Styles) As Boolean
|
|
Get
|
|
Return (Me.Style And st) = st
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
Dim sty As Styles = Me.Style
|
|
If (sty And st) = st <> value Then
|
|
If value = True Then sty += st Else sty -= st
|
|
Me.Style = sty
|
|
End If
|
|
End Set
|
|
End Property
|
|
|
|
Public Property Style() As Styles
|
|
Get
|
|
Return GetWindowLong(Me.HandleRef, GWL.STYLE)
|
|
End Get
|
|
Set(ByVal value As Styles)
|
|
Try
|
|
SetWindowLong(Me.hwnd, GWL.STYLE, value)
|
|
Catch ex As Exception
|
|
End Try
|
|
End Set
|
|
End Property
|
|
|
|
Public Property AllowDrop() As Boolean
|
|
Get
|
|
Return ExStyle(ExStyles.AllowDrop)
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
ExStyle(ExStyles.AllowDrop) = value
|
|
End Set
|
|
End Property
|
|
Public Property TopMost() As Boolean
|
|
Get
|
|
Return ExStyle(ExStyles.TopMost)
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
ExStyle(ExStyles.TopMost) = value
|
|
End Set
|
|
End Property
|
|
Public Property TabStop() As Boolean
|
|
Get
|
|
Return Style(Styles.TabStop)
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
Style(Styles.TabStop) = value
|
|
End Set
|
|
End Property
|
|
|
|
Public Function SendKey(ByVal Key As Keys, ByVal EventType As KeyEvent)
|
|
Dim k As New KeyCommand(Key, EventType)
|
|
k.RepeatCount = 0
|
|
Return SendKey(k)
|
|
End Function
|
|
Public Function SendPressedKey(ByVal key As Keys, Optional ByVal SendCount As Integer = 1)
|
|
Dim success As Boolean = True
|
|
Dim k_down As New KeyCommand(key, KeyEvent.Down)
|
|
Dim k_up As New KeyCommand(key, KeyEvent.Up)
|
|
For i As Integer = 1 To SendCount
|
|
If SendKey(k_down) = False Then success = False
|
|
If SendKey(k_up) = False Then success = False
|
|
Next
|
|
Return success
|
|
End Function
|
|
Public Function SendKey(ByVal k As KeyCommand)
|
|
Return k.Post(Me.hwnd)
|
|
End Function
|
|
Public Function SendChar(ByVal character As Char, Optional ByVal SendCount As Integer = 1) As Boolean
|
|
Dim k As New KeyCommand(character)
|
|
k.RepeatCount = SendCount - 1
|
|
Return SendKey(k)
|
|
End Function
|
|
Public Function SendChars(ByVal text() As Char)
|
|
Dim success As Boolean = True
|
|
For Each character As Char In text
|
|
If SendChar(character) = False Then success = False
|
|
Next
|
|
Return success
|
|
End Function
|
|
Public Function SendMouse(ByVal Location As Point, Optional ByVal Buttons As MouseButtons = MouseButtons.None, Optional ByVal EventType As MouseEvent = MouseEvent.Move)
|
|
Return SendMouse(New MouseCommand(Location, Buttons, EventType))
|
|
End Function
|
|
Public Function SendMouse(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Buttons As MouseButtons = MouseButtons.None, Optional ByVal EventType As MouseEvent = MouseEvent.Move)
|
|
Return SendMouse(New MouseCommand(X, Y, Buttons, EventType))
|
|
End Function
|
|
Public Function SendMouse(ByVal m As MouseCommand) As Boolean
|
|
Return m.Post(Me.hwnd)
|
|
End Function
|
|
|
|
Public Sub Command(ByVal command As CMD)
|
|
Select Case command
|
|
Case CMD.Close
|
|
API.WM.CLOSE(Me.hwnd)
|
|
Case CMD.Destroy
|
|
API.WM.DESTROY(Me.hwnd)
|
|
Case CMD.BringToFront
|
|
SetWindowPos(Me.hwnd, HWNDafter.BOTTOM, 0, 0, 0, 0, SWP.IgnoreResize Or SWP.IgnoreMove)
|
|
Case CMD.SendToBack
|
|
SetWindowPos(Me.hwnd, HWNDafter.BOTTOM, 0, 0, 0, 0, SWP.IgnoreResize Or SWP.IgnoreMove Or SWP.DoNotActivate)
|
|
Case CMD.Show
|
|
Dim d As New WindowPlacement(Me.hwnd)
|
|
d.showCmd = 5
|
|
d.Send(Me.hwnd)
|
|
Case CMD.Flash
|
|
FlashWindow(Me.hwnd, True)
|
|
Case CMD.Hide
|
|
Dim d As New WindowPlacement(Me.hwnd)
|
|
d.showCmd = 0
|
|
d.Send(Me.hwnd)
|
|
Case CMD.Focus
|
|
Me.Focused = True
|
|
Case CMD.Clear
|
|
API.WM.CLEAR(Me.hwnd)
|
|
Case CMD.Undo
|
|
API.WM.UNDO(Me.hwnd)
|
|
Case CMD.Copy
|
|
API.WM.Copy(Me.hwnd)
|
|
Case CMD.Paste
|
|
API.WM.PASTE(Me.hwnd)
|
|
Case CMD.Cut
|
|
API.WM.CUT(Me.hwnd)
|
|
End Select
|
|
End Sub
|
|
|
|
'-------------not sure if these work--------------
|
|
Public ReadOnly Property SystemMenu() As Window
|
|
Get
|
|
Return New Window(GetSystemMenu(Me.hwnd, False))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property Menu() As Window
|
|
Get
|
|
Return New Window(GetMenu(Me.hwnd))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property SubMenus(ByVal index As Integer) As Window
|
|
Get
|
|
Return New Window(GetSubMenu(Me.hwnd, index))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property SubMenus() As Window()
|
|
Get
|
|
Dim menus As New List(Of IntPtr)
|
|
Dim currm As IntPtr = 0
|
|
For i As Integer = 0 To Integer.MaxValue
|
|
currm = GetSubMenu(Me.hwnd, i)
|
|
If currm = 0 Then
|
|
Exit For
|
|
Else
|
|
menus.Add(currm)
|
|
End If
|
|
Next
|
|
Return All(menus)
|
|
End Get
|
|
End Property
|
|
'-------------------------------------------------
|
|
|
|
Public ReadOnly Property Process() As Process
|
|
Get
|
|
Try
|
|
Dim ID As UInteger
|
|
GetWindowThreadProcessId(Me.hwnd, ID)
|
|
Return Process.GetProcessById(ID)
|
|
Catch
|
|
Return Nothing
|
|
End Try
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property ClassName(Optional ByVal length As Integer = 64) As String
|
|
Get
|
|
Dim s As New System.Text.StringBuilder(length)
|
|
GetClassName(Me.hwnd, s, s.Capacity)
|
|
Return s.ToString()
|
|
End Get
|
|
End Property
|
|
Public Property Parent() As Window
|
|
Get
|
|
Dim Phwnd As IntPtr = GetParent(Me.hwnd)
|
|
If Phwnd = 0 Then Return Nothing
|
|
Return New Window(Phwnd)
|
|
End Get
|
|
Set(ByVal value As Window)
|
|
SetParent(Me.hwnd, value.Handle)
|
|
End Set
|
|
End Property
|
|
Public ReadOnly Property Children() As Window()
|
|
Get
|
|
Return Window.All(New Enumerator().GetChildWindows(Me.hwnd))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property Children(ByVal index As Integer) As Window
|
|
Get
|
|
Return New Window(New Enumerator().GetChildWindows(Me.hwnd)(index))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property Children(ByVal name As String) As Window
|
|
Get
|
|
Dim hwnd As IntPtr = FindWindowEx(Me.hwnd, 0, name, vbNullString)
|
|
If hwnd = 0 Then
|
|
For Each c As Window In Me.Children
|
|
If c.Name = name Then Return c
|
|
Next
|
|
Return Nothing
|
|
End If
|
|
Return New Window(hwnd)
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property Children(ByVal Location As Point) As Window
|
|
Get
|
|
Return New Window(ChildWindowFromPoint(Me.hwnd, New API.WPOINT(Location.X, Location.Y)))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property ChildIndex(ByVal name As String) As Integer
|
|
Get
|
|
Dim w() As Window = Me.Children
|
|
For i As Integer = 0 To w.Count - 1
|
|
If w(i).Name = name Then Return i
|
|
Next
|
|
Return -1
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property TopSibling() As Window
|
|
Get
|
|
Return New Window(GetWindow(Me.hwnd, GW.HWNDFIRST))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property BottomSibling() As Window
|
|
Get
|
|
Return New Window(GetWindow(Me.hwnd, GW.HWNDLAST))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property PreviousSibling() As Window
|
|
Get
|
|
Return New Window(GetWindow(Me.hwnd, GW.HWNDPREV))
|
|
End Get
|
|
End Property
|
|
Public ReadOnly Property NextSibling() As Window
|
|
Get
|
|
Return New Window(GetWindow(Me.hwnd, GW.HWNDNEXT))
|
|
End Get
|
|
End Property
|
|
Public Function FindChild(ByVal name As String, Optional ByVal matchcase As Boolean = False) As Window
|
|
If matchcase = False Then name = name.ToLower
|
|
For Each w As Window In Me.Children
|
|
Dim wn As String = w.Name
|
|
If matchcase = False Then wn = wn.ToLower
|
|
If wn.Contains(name) Then Return w
|
|
Next
|
|
Return Nothing
|
|
End Function
|
|
Public Property FocusedWindow() As Window
|
|
Get
|
|
Me.AttachInput()
|
|
FocusedWindow = New Window(GetFocus)
|
|
Me.DetachInput()
|
|
End Get
|
|
Set(ByVal value As Window)
|
|
value.Command(CMD.Focus)
|
|
End Set
|
|
End Property
|
|
|
|
Public Function AttachInput(Optional ByVal attach As Boolean = True) As Boolean
|
|
Return CBool(API.AttachThreadInput(GetWindowThreadProcessId(Me.hwnd, 0), API.GetCurrentThreadId(), CInt(attach)))
|
|
End Function
|
|
Public Function DetachInput() As Boolean
|
|
Return AttachInput(False)
|
|
End Function
|
|
|
|
Public Shared Function All(ByVal p() As Process) As Window()
|
|
Dim w As New List(Of Window)
|
|
For Each proc As Process In p
|
|
If proc.MainWindowHandle <> 0 Then w.Add(New Window(proc.MainWindowHandle))
|
|
Next
|
|
Return w.ToArray
|
|
End Function
|
|
Public Shared Function All() As Window()
|
|
Return New Window(IntPtr.Zero).Children
|
|
End Function
|
|
Public Shared Function All(ByVal ParamArray hwnd() As IntPtr) As Window()
|
|
Dim w(hwnd.Count - 1) As Window
|
|
For i As Integer = 0 To w.Count - 1
|
|
w(i) = New Window(hwnd(i))
|
|
Next
|
|
Return w
|
|
End Function
|
|
Public Shared Function All(ByVal hwnd As List(Of IntPtr)) As Window()
|
|
Dim w(hwnd.Count - 1) As Window
|
|
For i As Integer = 0 To w.Count - 1
|
|
w(i) = New Window(hwnd(i))
|
|
Next
|
|
Return w
|
|
End Function
|
|
Public Shared Function All(ByVal p As Process) As Window()
|
|
Return All(New Enumerator().GetThreadWindows(p.Id))
|
|
End Function
|
|
Public Shared Function AllFromDesktop(ByVal desktophwnd As IntPtr) As Window()
|
|
Return All(New Enumerator().GetDesktopWindows(desktophwnd))
|
|
End Function
|
|
Public Shared Function AllFromDesktop() As Window()
|
|
Return AllFromDesktop(Nothing)
|
|
End Function
|
|
Public Shared Function AllFromProcessList() As Window()
|
|
Return All(Process.GetProcesses)
|
|
End Function
|
|
Public Shared Function FromControl(ByVal c As Control) As Window
|
|
Return New Window(c.Handle)
|
|
End Function
|
|
Public Shared Function FromPoint(ByVal p As Point) As Window
|
|
Return New Window(WindowFromPoint(New API.WPOINT(p.X, p.Y)))
|
|
End Function
|
|
Public Shared Function FromHandle(ByVal hwnd As IntPtr) As Window
|
|
Return New Window(hwnd)
|
|
End Function
|
|
Public Shared Function Find(ByVal name As String, Optional ByVal matchcase As Boolean = False) As Window
|
|
Return New Window(IntPtr.Zero).FindChild(name, matchcase)
|
|
End Function
|
|
Public Shared Function GetActive() As Window
|
|
Return New Window(GetForegroundWindow)
|
|
End Function
|
|
Public Shared Function GetDesktop() As Window
|
|
Return New Window(GetDesktopWindow())
|
|
End Function
|
|
Public Shared Function GetTop(ByVal parent As Window) As Window
|
|
Return New Window(GetTopWindow(parent.hwnd))
|
|
End Function
|
|
Public Shared Function GetTop() As Window
|
|
Return New Window(GetTopWindow(Nothing))
|
|
End Function
|
|
Public Shared Function GetForeground() As Window
|
|
Return New Window(GetForegroundWindow())
|
|
End Function
|
|
Public Shared Function GetFocused() As Window
|
|
Return GetForeground.FocusedWindow
|
|
End Function
|
|
End Class |