2015-12-23 27 views
6

Şu anda bir pencerenin açık olup olmadığını veya Findwindow Function'u kullanıp kullanmadığınızı kontrol etmenin bir yolunu bulmaya çalışıyorum. Pencerenin tüm adını bildiğimde pencereyi bulabiliyorum. Aşağıdaki kodda pencerenin isminin "win32api - Notepad" olduğunu biliyorum, böylece pencereyi kolayca bulabilirim, ancak sadece "win32 *" gibi parça adlarını biliyorsanız pencereyi tanımlamanın mümkün olup olmadığını bilmek istiyorum.Pencere ile vba kullanarak findwindow işlevini kullanarak pencere nasıl bulunur?

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

Birisi mi aradı? XD Hiç sorduğum ilk soruyu kontrol et. – findwindow

+0

Merhaba Findwindow çözümü ile bana yardımcı olabilir –

+0

Belki de 'instr' deneyin? Bilmiyorum. – findwindow

cevap

4

Bunu yapmanın bir yolu, EnumWindows API işlevidir. Bu bir geri arama fonksiyonu aracılığıyla faaliyet olduğundan, çağıran işlevi ötesinde kapsamı vardır bir yerde kriterleri ve sonuçları hem önbelleğe gerekir:

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

Teşekkürler Comintem. Kodunuz benim için çalıştı, kodda biraz değişiklik yaptı ve işe yaradı. –

+0

@RAJATHEVAR, sonra çözümü bir cevap olarak kabul edebilirsiniz. –

2

Aşağıdaki kod benim için çalıştı. Sadece isWindowVisible Fonksiyonu Bildirildi ve projeme Microsoft betik çalışma zamanı kitaplığı eklendi.

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