2015-12-23 72 views
6

Attualmente sto cercando di trovare un modo per verificare se una finestra è aperta o non utilizza la funzione Findwindow. Sono in grado di trovare la finestra se conosco l'intero nome della finestra. Nel codice qui sotto so che il nome della finestra è "win32api - Blocco note", quindi posso facilmente trovare la finestra, ma voglio sapere se è possibile identificare la finestra se conosco solo il nome della parte come "win32 *".Come individuare la finestra utilizzando la funzione findwindow in windowapi usando vba?

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 

Sub runapplication() 


hwnd = FindWindow(vbNullString, "win32api - Notepad") 
MsgBox (hwnd) 
End Sub 
+1

Qualcuno ha chiamato? XD Controlla la prima domanda che ho mai fatto. – findwindow

+0

Ciao Findwindow puoi aiutarmi con la soluzione –

+0

Forse provare a 'instr'? Non lo so. – findwindow

risposta

4

Un modo per farlo è con la funzione EnumWindows API. Dal momento che opera tramite una funzione di callback, è necessario memorizzare nella cache sia i criteri ed i risultati da qualche parte che ha portata al di là della funzione chiamante:

Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, _ 
                ByVal param As Long) As Long 
Public Declare Function IsWindowVisible Lib "User32" (ByVal hWnd As Long) As Long 
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ 
               (ByVal hwnd As Long, _ 
                ByVal lpString As String, _ 
                ByVal cch As Long) As Long 
Public Const MAX_LEN = 260 

Public results As Dictionary 
Public criteria As String 

Public Sub Example() 
    criteria = "win32*" 
    Set results = New Dictionary 
    Call EnumWindows(AddressOf EnumWindowCallback, &H0) 
    Dim result As Variant 
    For Each result In results.Keys 
     Debug.Print result & " - " & results(result) 
    Next result 
End Sub 

Public Function EnumWindowCallback(ByVal hwnd As Long, ByVal param As Long) As Long 
    Dim retValue As Long 
    Dim buffer As String  
    If IsWindowVisible(hwnd) Then 
     buffer = Space$(MAX_LEN) 
     retValue = GetWindowText(hwnd, buffer, Len(buffer)) 
     If retValue Then 
      If buffer Like criteria Then 
       results.Add hwnd, Left$(buffer, retValue) 
      End If 
     End If 
    End If 
    EnumWindowCallback = 1 
End Function 
+0

Grazie Comintem. Il tuo codice ha funzionato per me, ha apportato alcune modifiche minori nel codice e ha funzionato. –

+0

@RAJATHEVAR, quindi è possibile accettare la soluzione come risposta. –

2

Il seguente codice ha funzionato per me. Appena dichiarata funzione IsWindowVisible e aggiunta libreria di runtime di scripting Microsoft al mio progetto.

Public Declare Function EnumWindows Lib "User32" (ByVal lpEnumFunc As Long, _ 
                ByVal param As Long) As Long 
Public Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" _ 
               (ByVal hWnd As Long, _ 
                ByVal lpString As String, _ 
                ByVal cch As Long) As Long 
Public Declare Function IsWindowVisible Lib "User32" (ByVal hWnd As Long) As Long 
Public Const MAX_LEN = 260 

Public results As Dictionary 
Public criteria As String 

Public Sub Example() 
    criteria = "win32" 
    Set results = New Dictionary 
    Call EnumWindows(AddressOf EnumWindowCallback, &H0) 
    Dim result As Variant 
    For Each result In results.Keys 
     Debug.Print result & " - " & results(result) 
    Next result 
End Sub 

Public Function EnumWindowCallback(ByVal hWnd As Long, ByVal param As Long) As Long 
    Dim retValue As Long 
    Dim buffer As String 
    If IsWindowVisible(hWnd) Then 
     buffer = Space$(MAX_LEN) 
     retValue = GetWindowText(hWnd, buffer, Len(buffer)) 
     If retValue Then 

      If InStr(1, buffer, criteria, vbTextCompare) > 0 Then 
       results.Add hWnd, Left$(buffer, retValue) 
      End If 
     End If 
    End If 
    EnumWindowCallback = 1 
End Function