如何使用Excel VBA获取Windows应用程序进程mainwindowtitle和窗口状态属性?

时间:2017-01-06 18:04:11

标签: vba excel-vba win32-process excel

需要帮助使用 Excel VBA脚本获取mainwindowtitle或窗口状态属性?

在我的Windows机器上,我有两个以相同名称运行的进程,例如xyz.exe。

其中一个有Windows应用程序,另一个是帮助程序或后台进程。我想找出使用​​mainwindowtitle或窗口状态属性的Windows应用程序进程。

我选择这些属性的原因是因为后台进程没有主窗口,窗口状态为空。以下是显示两个过程的过程浏览器屏幕截图。

enter image description here

为脚本和应用程序使用WMI任务我可以轻松找到进程ID,但我无法弄清楚如何获取mainwindowtitle或window status属性。

Private Sub getP()       
    strComputer = "."
    sExeName = "XYZ.exe"

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process 
    WHERE Name = '" & sExeName & "'", , 48)

    For Each objItem In colItems
      Debug.Print "ProcessId: " & objItem.ProcessId
    Next
End Sub

1 个答案:

答案 0 :(得分:3)

根据David在评论中提到的内容,试试这个:

Private Const GW_HWNDNEXT = 2
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount 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

Sub ListWins(Optional Title = "*XYZ*", Optional Class = "*")
    Dim hWndThis As Long
    hWndThis = FindWindow(vbNullString, vbNullString)
    While hWndThis
        Dim sTitle As String, sClass As String
        sTitle = Space$(255)
        sTitle = Left$(sTitle, GetWindowText(hWndThis, sTitle, Len(sTitle)))
        sClass = Space$(255)
        sClass = Left$(sClass, GetClassName(hWndThis, sClass, Len(sClass)))
        If sTitle Like Title And sClass Like Class Then
            Debug.Print sTitle, sClass
        End If
        hWndThis = GetWindow(hWndThis, GW_HWNDNEXT)
    Wend
End Sub