2015-12-23 51 views
6

Aktualnie próbuję znaleźć sposób na sprawdzenie, czy okno jest otwarte, czy nie, używając funkcji Findwindow. Jestem w stanie znaleźć okno, jeśli znam całą nazwę okna. W poniższym kodzie wiem, że nazwa okna to "win32api - Notepad", więc mogę łatwo znaleźć okno, ale chcę wiedzieć, czy możliwe jest zidentyfikowanie okna, jeśli znam tylko nazwę części taką jak "win32 *".Jak zlokalizować okno przy użyciu funkcji findwindow w windowapi przy użyciu 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

Ktoś dzwonił? XD Sprawdź pierwsze pytanie, jakie kiedykolwiek zadałem. – findwindow

+0

Witaj Findwindow, czy możesz mi pomóc z rozwiązaniem –

+0

Może wypróbujesz 'instr'? Nie wiem – findwindow

Odpowiedz

4

Jednym ze sposobów można to zrobić za pomocą funkcji EnumWindows API. Ponieważ działa poprzez funkcję zwrotną, trzeba buforować oba kryteria i wyniki gdzieś, że ma poza zakres funkcji wywołującej:

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

Dzięki Comintem. Twój kod zadziałał, wykonałem drobną modyfikację kodu i zadziałało. –

+0

@RAJATHEVAR, możesz zaakceptować rozwiązanie jako odpowiedź. –

2

Poniższy kod pracował dla mnie. Po prostu zadeklarowano funkcję IsWindowVisible i dodano bibliotekę wykonawczą Microsoft scripting do mojego projektu.

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