VBA-查找知道其标题,类及其所有者的窗口句柄

时间:2019-02-22 13:58:04

标签: vba api findwindow

这应该很容易,但是它并不能像我想象的那样工作。 它与Corel DRAW的“打印合并向导”窗口有关。 我可以找到带有Spy ++,其标题和其类的窗口。 我无法使用API​​查找其句柄。 使用FindWindow,我只能获得Corel主窗口:

TxtHwnd = FindWindow("CorelDRAW18", vbNullString)

当我以相同的方式尝试使用标题和类时,它无法返回该句柄:

hMerge = FindWindow("#32770 (Dialog)", "Print Merge Wizard")

我尝试以另一种方式使用FindWindowEx,但没有成功:

TxtHwnd = FindWindow("CorelDRAW18", vbNullString): Debug.Print TxtHwnd
hMerge = FindWindowEx(TxtHwnd, ByVal CLngPtr(0), "#32770 (Dialog)", "Print Merge Wizard")

我还尝试使用以下方法遍历所有打开的窗口:

    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
            Stop
        End If
        hWndThis = GetWindow(hWndThis, GW_HWNDNEXT)
        Debug.Print sTitle, sClass, hWndThis
    Wend 
End Sub

像这样调用函数:

ListWins "Print Merge Wizard", "#32770 (Dialog)"

讨论中的窗口不在代码显示的窗口之间... 查看Spy ++窗口属性,可以看到“打印合并向导”不是Corel子窗口。它只是向Corel展示了自己的主人身份……

了解了所有这些,您认为我可以通过哪种方式捕获打印合并向导窗口处理程序

谢谢!

2 个答案:

答案 0 :(得分:0)

即使没有正确的类名,也可以使用FindWindow进行操作,即使该类名正确:

hwndWiz = FindWindow(vbNullString, "Print Merge Wizard")返回正确的处理程序。

答案 1 :(得分:0)

类名不是“#32770 (Dialog)”而是“#32770”,Spy++附加了“(Dialog)”部分。

如果标题有前导“&”,则必须将其保留在传递给 API 函数的参数中。