Something like this. You must know at least part of the window caption, which shouldn't be a problem because things like "Microsoft Word", "Microsoft Internet Explorer","Notepad" usually get appended to the end
In a Module
VB Code:
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
Private Const WM_GETTEXT = &HD
Private aCaptions() As String
Private lCount As Long
Public Function GetAllCaptions() As Variant
lCount = 0
Call EnumWindows(AddressOf EnumWindowsProc, 0&)
If lCount Then ReDim Preserve aCaptions(lCount - 1)
GetAllCaptions = IIf(lCount, aCaptions, Array())
End Function
Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim sBuffer As String * 260
If IsWindowVisible(hwnd) Then
ReDim Preserve aCaptions(lCount)
aCaptions(lCount) = Left(sBuffer, SendMessage(hwnd, WM_GETTEXT, 260, ByVal sBuffer))
If Len(Trim(aCaptions(lCount))) Then lCount = lCount + 1
End If
EnumWindowsProc = hwnd
End Function
Form Code:
VB Code:
Public Function IsOpen(strTitle As String) As Boolean
Dim vCaps As Variant
Dim lIndex As Long
vCaps = GetAllCaptions()
For lIndex = 0 To UBound(vCaps)
If InStr(1, vCaps(lIndex), strTitle, vbTextCompare) Then
IsOpen = True
Exit Function
End If
Next
IsOpen = False
End Function
Private Sub Command1_Click()
If IsOpen("Notepad") = False Then
Shell "Notepad.exe", vbMaximizedFocus
End If
End Sub