Option Explicit
' Module Name: ModFindWindowLike
' (c) 2005 Wayne Phillips (http://www.everythingaccess.com)
' Written 02/06/2005
'
' mODIFIED bY aRNELgP FOR x64 aCCESS
'
#If VBA7 Then
#If Win64 Then
Private Declare PtrSafe Function EnumWindows Lib "user32" (ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
'Could use global variables instead, but this is nicer.
'Custom structure for passing in the parameters in/out of the hook enumeration function
'Could use global variables instead, but this is nicer.
Private Type FindWindowParameters
strTitle As String 'INPUT
hwnd As LongPtr 'OUTPUT
End Type
#Else
Private Declare PtrSafe Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
'Could use global variables instead, but this is nicer.
'Custom structure for passing in the parameters in/out of the hook enumeration function
'Could use global variables instead, but this is nicer.
Private Type FindWindowParameters
strTitle As String 'INPUT
hwnd As Long 'OUTPUT
End Type
#End If
#Else
Private Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long
'Could use global variables instead, but this is nicer.
'Custom structure for passing in the parameters in/out of the hook enumeration function
'Could use global variables instead, but this is nicer.
Private Type FindWindowParameters
strTitle As String 'INPUT
hwnd As Long 'OUTPUT
End Type
#End If
#If VBA7 And Win64 Then
Public Function FnFindWindowLike(strWindowTitle As String) As LongPtr
#Else
Public Function FnFindWindowLike(strWindowTitle As String) As Long
#End If
'We'll pass a custom structure in as the parameter to store our result...
Dim Parameters As FindWindowParameters
Parameters.strTitle = UCase(strWindowTitle) ' Input parameter
#If VBA7 And Win64 Then
Call EnumWindows(AddressOf EnumWindowProc, VarPtr(Parameters))
#Else
Call EnumWindows(AddressOf EnumWindowProc, VarPtr(Parameters))
#End If
FnFindWindowLike = Parameters.hwnd
End Function
#If VBA7 And Win64 Then
Private Function EnumWindowProc(ByVal hwnd As LongPtr, _
lParam As FindWindowParameters) As LongPtr
#Else
Private Function EnumWindowProc(ByVal hwnd As Long, _
lParam As FindWindowParameters) As Long
#End If
Dim strWindowTitle As String
strWindowTitle = Space(260)
Call GetWindowText(hwnd, strWindowTitle, 260)
strWindowTitle = UCase(TrimNull(strWindowTitle)) ' Remove extra null terminator
If strWindowTitle Like lParam.strTitle Then
lParam.hwnd = hwnd 'Store the result for later.
EnumWindowProc = 0 'This will stop enumerating more windows
Else
EnumWindowProc = 1
End If
End Function
Private Function TrimNull(strNullTerminatedString As String)
Dim lngPos As Long
'Remove unnecessary null terminator
lngPos = InStr(strNullTerminatedString, Chr$(0))
If lngPos Then
TrimNull = Left$(strNullTerminatedString, lngPos - 1)
Else
TrimNull = strNullTerminatedString
End If
Debug.Print TrimNull
End Function
Private Sub test()
#If VBA7 And Win64 Then
Dim h As LongPtr
#Else
Dim h As Long
#End If
Dim i As Integer
Dim wa As Word.Application
Dim wd As Word.Document
Set wa = New Word.Application
Set wd = wa.Documents.Add
wa.Visible = True
'wa.Activate
h = FnFindWindowLike("*word*")
Debug.Print h
Call MouseToWinHandle(h)
For i = 1 To 5000
DoEvents
Next i
Call MouseToForm
wa.Quit False
End Sub