I wrote this function a while back, but its often quite useful, so I thought that I would post it back up here.
Its basically the equivalent of the SetWindowPos API, which is used for setting various properties of a window.
This function is slightly edited from the one previously posted, which had an error in the size calculation and this also uses the .net Point and Rectangle structures
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As IntPtr, ByVal wFlag As Integer) As IntPtr Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As IntPtr, ByRef lpwndpl As WINDOWPLACEMENT) As Integer Private Structure WINDOWPLACEMENT Public Length As Integer Public flags As Integer Public showCmd As Integer Public ptMinPosition As Point Public ptMaxPosition As Point Public rcNormalPosition As Rectangle End Structure Public Enum WNDSTATE SW_HIDE = 0 SW_SHOWNORMAL = 1 SW_NORMAL = 1 SW_SHOWMINIMIZED = 2 SW_MAXIMIZE = 3 SW_SHOWNOACTIVATE = 4 SW_SHOW = 5 SW_MINIMIZE = 6 SW_SHOWMINNOACTIVE = 7 SW_SHOWNA = 8 SW_RESTORE = 9 SW_SHOWDEFAULT = 10 SW_MAX = 10 End Enum Private Const GW_HWNDNEXT = 2 Private Const GW_HWNDPREV = 3 ''' <summary > ''' Return values from equivalent to those in the SetWindowPos API ''' </summary > ''' <param name="hwnd" > In - The handle of the window you wish to get the information from</param > ''' <param name="ptrPhwnd" > Out - Returns the handle of the previous window in the Z order</param > ''' <param name="ptrNhwnd" > Out - Returns the handle of the next window in the Z order</param > ''' <param name="ptPoint" > Out - Returns the location of the specified window on the screen</param > ''' <param name="szSize" > Out - Returns the size of the specified window</param > ''' <param name="intShowCmd" > Out - Returns the state of the window, returns a WNDSTATE value</param > ''' <remarks > If you use the function on a control, it will return the handles for the buttons next in the forms Z order. ''' If the handle passed for hwnd is invalid, the function will return 0 for all values</remarks > Public Sub GetWindowPos(ByVal hwnd As Integer, ByRef ptrPhwnd As Integer, ByRef ptrNhwnd As Integer, ByRef ptPoint As Point, ByRef szSize As Size, ByRef intShowCmd As WNDSTATE) Dim wInf As WINDOWPLACEMENT wInf.Length = System.Runtime.InteropServices.Marshal.SizeOf(wInf) GetWindowPlacement(hwnd, wInf) szSize = New Size(wInf.rcNormalPosition.Right - (wInf.rcNormalPosition.Left * 2), wInf.rcNormalPosition.Bottom - (wInf.rcNormalPosition.Top * 2)) ptPoint = New Point(wInf.rcNormalPosition.Left, wInf.rcNormalPosition.Top) ptrPhwnd = GetNextWindow(hwnd, GW_HWNDPREV) ptrNhwnd = GetNextWindow(hwnd, GW_HWNDNEXT) intShowCmd = wInf.showCmd End Sub
Usage:
Dim hwnd As Integer = Process.GetProcessesByName("calc")(0).MainWindowHandle Dim ptrPhwnd, ptrNhwnd As Integer Dim ptPoint As Point Dim szSize As Size Dim intShowCmd As WNDSTATE GetWindowPos(hwnd, ptrPhwnd, ptrNhwnd, ptPoint, szSize, intShowCmd) Debug.WriteLine("Window Handle: " & hwnd) Debug.WriteLine("Previous Window Handle: " & ptrPhwnd) Debug.WriteLine("Next Window Handle: " & ptrNhwnd) Debug.WriteLine("Window Location: (" & ptPoint.X & ", " & ptPoint.Y & ")") Debug.WriteLine("Window Size - Width: " & szSize.Width & " Height: " & szSize.Height) Debug.WriteLine("Window State: " & intShowCmd.ToString)
Would output:
Window Handle: 4065694
Previous Window Handle: 8194392
Next Window Handle: 263910
Window Location: (2934, 89)
Window Size – Width: 480 Height: 310
Window State: SW_NORMAL
1 Response to “[VB.Net] GetWindowPos”