From cf1bf85e01c8d99f052c09b72d2fb2bbbc0b99b0 Mon Sep 17 00:00:00 2001 From: FloppyDiskDrive Date: Thu, 21 Sep 2017 17:16:49 -0500 Subject: Added the SOS code (VB and C#) Very, very incomplete (C# isn't *remotely* complete.) --- ShiftOS/Window.vb | 1127 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1127 insertions(+) create mode 100644 ShiftOS/Window.vb (limited to 'ShiftOS/Window.vb') diff --git a/ShiftOS/Window.vb b/ShiftOS/Window.vb new file mode 100644 index 0000000..641034f --- /dev/null +++ b/ShiftOS/Window.vb @@ -0,0 +1,1127 @@ +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 + ''' 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. + ''' SWP_ASYNCWINDOWPOS + SynchronousWindowPosition = &H4000 + ''' Prevents generation of the WM_SYNCPAINT message. + ''' SWP_DEFERERASE + DeferErase = &H2000 + ''' Draws a frame (defined in the window's class description) around the window. + ''' SWP_DRAWFRAME + DrawFrame = &H20 + ''' 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. + ''' SWP_FRAMECHANGED + FrameChanged = &H20 + ''' Hides the window. + ''' SWP_HIDEWINDOW + HideWindow = &H80 + ''' 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). + ''' SWP_NOACTIVATE + DoNotActivate = &H10 + ''' 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. + ''' SWP_NOCOPYBITS + DoNotCopyBits = &H100 + ''' Retains the current position (ignores X and Y parameters). + ''' SWP_NOMOVE + IgnoreMove = &H2 + ''' Does not change the owner window's position in the Z order. + ''' SWP_NOOWNERZORDER + DoNotChangeOwnerZOrder = &H200 + ''' 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. + ''' SWP_NOREDRAW + DoNotRedraw = &H8 + ''' Same as the SWP_NOOWNERZORDER flag. + ''' SWP_NOREPOSITION + DoNotReposition = &H200 + ''' Prevents the window from receiving the WM_WINDOWPOSCHANGING message. + ''' SWP_NOSENDCHANGING + DoNotSendChangingEvent = &H400 + ''' Retains the current size (ignores the cx and cy parameters). + ''' SWP_NOSIZE + IgnoreResize = &H1 + ''' Retains the current Z order (ignores the hWndInsertAfter parameter). + ''' SWP_NOZORDER + IgnoreZOrder = &H4 + ''' Displays the window. + ''' SWP_SHOWWINDOW + 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 + _ + Private Shared Function GetWindowLongPtr32(ByVal hWnd As Runtime.InteropServices.HandleRef, ByVal nIndex As Integer) As Long + End Function + _ + 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 + ''' + ''' 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. + ''' + Invalidate = &H1 + ''' Causes the OS to post a WM_PAINT message to the window regardless of whether a portion of the window is invalid. + InternalPaint = &H2 + ''' + ''' 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. + ''' + [Erase] = &H4 + ''' + ''' 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. + ''' + Validate = &H8 + NoInternalPaint = &H10 + ''' Suppresses any pending WM_ERASEBKGND messages. + NoErase = &H20 + ''' Excludes child windows, if any, from the repainting operation. + NoChildren = &H40 + ''' Includes child windows, if any, in the repainting operation. + AllChildren = &H80 + ''' 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. + UpdateNow = &H100 + ''' + ''' 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. + ''' + 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 \ No newline at end of file -- cgit v1.2.3