How to Find a Window Handle Based on an Instance HandleID: Q127030
|
The Shell function in Microsoft Visual Basic is used to execute an application. Often, it is useful to get a Window handle (hWnd) to the application so you can manipulate it using the Windows APIs. Unfortunately, the Shell function returns an Instance handle (hInstance), which is different from a Window handle. This article shows by example how to use the GetWinHandle() function to return a Window handle based on an Instance handle.
By using the FindWindow() and GetWindow() APIs, you can loop through the
Window handle list. For each window handle, you can check to see if it has
a parent window with GetParent(). If the Window handle does not have a
parent handle, you've reached the main window for an application. You can
call GetWindowWord() to check the instance handle of the application versus
the instance handle received from the Shell() function.
' Constants used
Global Const GW_HWNDNEXT = 2
Global Const GWW_HINSTANCE = (-6)
' Enter each of the following declarations as one, single line:
Declare Function GetParent Lib "User" (ByVal hWnd As Integer) As Integer
Declare Function GetWindow Lib "User" (ByVal hWnd As Integer,
ByVal wCmd As Integer) As Integer
Declare Function GetWindowWord Lib "User" (ByVal hWnd As Integer,
ByVal nIndex As Integer) As Integer
Declare Function FindWindow Lib "User" (ByVal lpClassName As Any,
ByVal lpWindowName As Any) As Integer
Declare Function GetWindowText Lib "User" (ByVal hWnd As Integer,
ByVal lpString As String, ByVal aint As Integer) As Integer
Function GetWinHandle (hInstance%) As Integer
' Function receives an instance handle as a parameter and returns
' the windows handle of the window with a matching instance handle.
Dim tempHwnd%
' Grab the first window handle that Window's finds:
tempHwnd% = FindWindow(0&, 0&)
' Loop until there are no more window handles:
Do Until tempHwnd% = 0
' Check if you have the applications Parent window:
If GetParent(tempHwnd%) = 0 Then
' Check the instance handle for the app:
If hInstance% = GetWindowWord(tempHwnd%, GWW_HINSTANCE) Then
' Found a match:
GetWinHandle = tempHwnd%
Exit Do
End If
End If
tempHwnd% = GetWindow(tempHwnd%, GW_HWNDNEXT)
Loop
End Function
Sub Command1_Click ()
Dim hInst As Integer ' Instance handle from Shell function.
Dim hWndApp As Integer ' Window handle from GetWinHandle.
Dim buffer As String ' Holds caption of Window.
Dim numChars As Integer ' Count of bytes returned.
' Shell to an application and get its window handle:
hInst = Shell("calc.exe")
hWndApp = GetWinHandle(hInst)
' Verify that you have the correct handle by displaying
' its window caption in a message box:
buffer = Space$(128)
numChars = GetWindowText(hWndApp, buffer, Len(buffer))
MsgBox "You shelled to the Application: " & Left$(buffer, numChars)
End Sub
Additional query words: 2.00 3.00
Keywords : kbcode
Version : 2.00 3.00
Platform : WINDOWS
Issue type :
Last Reviewed: May 26, 1999