VBA - 找到一个 window 句柄,知道它的标题,class 和它的所有者
VBA - Find a window handle knowing its caption, class and its owner
应该很容易,但不是我想象的那样...
关于Corel DRAW的"Print Merge Wizard"window。
我可以用 Spy++、它的标题和它的 Class 找到 window。 我无法使用 API 找到它的句柄。
使用 FindWindow 我只能得到主要的 Corel Window:
TxtHwnd = FindWindow("CorelDRAW18", vbNullString)
当我以同样的方式尝试时,使用标题和 class,它不能 return 句柄:
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")
我还尝试使用以下方法遍历所有打开的 windows:
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)"
讨论中的window不在代码显示的之间...
查看 Spy++ window 属性,我可以看到打印合并向导不是 Corel child window。它只是表明 Corel 就像是它的所有者...
了解了所有这些,您认为我可以通过哪种方式捕获打印合并向导Window 处理程序?
提前致谢!
在没有 class 名称的情况下使用 FindWindow
很奇怪,即使 class 名称是正确的:
hwndWiz = FindWindow(vbNullString, "Print Merge Wizard")
returns 正确的处理程序。
class 名称不是“#32770 (Dialog)”,它只是“#32770”,“(Dialog)”部分是由 Spy++ 附加的。
如果标题有前导“&”,它必须保留在传递给 API 函数的参数中。
应该很容易,但不是我想象的那样... 关于Corel DRAW的"Print Merge Wizard"window。 我可以用 Spy++、它的标题和它的 Class 找到 window。 我无法使用 API 找到它的句柄。 使用 FindWindow 我只能得到主要的 Corel Window:
TxtHwnd = FindWindow("CorelDRAW18", vbNullString)
当我以同样的方式尝试时,使用标题和 class,它不能 return 句柄:
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")
我还尝试使用以下方法遍历所有打开的 windows:
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)"
讨论中的window不在代码显示的之间... 查看 Spy++ window 属性,我可以看到打印合并向导不是 Corel child window。它只是表明 Corel 就像是它的所有者...
了解了所有这些,您认为我可以通过哪种方式捕获打印合并向导Window 处理程序?
提前致谢!
在没有 class 名称的情况下使用 FindWindow
很奇怪,即使 class 名称是正确的:
hwndWiz = FindWindow(vbNullString, "Print Merge Wizard")
returns 正确的处理程序。
class 名称不是“#32770 (Dialog)”,它只是“#32770”,“(Dialog)”部分是由 Spy++ 附加的。
如果标题有前导“&”,它必须保留在传递给 API 函数的参数中。