Windows FindWindow()不工作

Windows FindWindow()不工作,windows,vba,winapi,user32,Windows,Vba,Winapi,User32,我正在写一个小VBA程序,需要等到特定的窗口打开。我想使用user32.dll中的FindFindow表单执行此操作,但无法运行它。奇怪的是,即使我将函数的2个参数设置为Null,我仍然会得到一个负返回,尽管在这种情况下,所有窗口都应该匹配。基本上,对于hwnd,我不会得到与0不同的结果,这与我如何调用FindWindow无关。我搜索了Stack OPverflow,也用谷歌搜索了这个问题,但我找不到我做错了什么。感谢您的帮助 Declare Function FindWindow Lib "u

我正在写一个小VBA程序,需要等到特定的窗口打开。我想使用user32.dll中的FindFindow表单执行此操作,但无法运行它。奇怪的是,即使我将函数的2个参数设置为Null,我仍然会得到一个负返回,尽管在这种情况下,所有窗口都应该匹配。基本上,对于hwnd,我不会得到与0不同的结果,这与我如何调用FindWindow无关。我搜索了Stack OPverflow,也用谷歌搜索了这个问题,但我找不到我做错了什么。感谢您的帮助

Declare Function FindWindow Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub Main
    Dim hwnd As Long

    hwnd = FindWindow(vbNullString, vbNullString)

    If (hwnd = 0) Then MsgBox ("failure")

End Sub

类似问题(如)的解决方案似乎也不起作用。

问题在于
vbNullString
是长度为0的字符串,与
相同。将其封送到非托管代码时,将传递指向以null结尾的字符数组的非null指针。由于长度为0,因此传递了指向空终止符的指针。这与作为空指针的
NULL
不同

我远非VBA专家,但我认为解决方案如下:

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByRef lpClassName As Any, ByRef lpWindowName As Any) As Long
如果要为两个参数调用此传递
NULL
,请执行以下操作:

window = FindWindow(ByVal 0&, ByVal 0&)
window = FindWindow(ByVal 0&, ByVal "Untitled - Notepad")
或者,如果要传递字符串值,请执行以下操作:

window = FindWindow(ByVal 0&, ByVal 0&)
window = FindWindow(ByVal 0&, ByVal "Untitled - Notepad")

这给了我一个类型不匹配错误。另外,我还报告说,使用vbNullString的语法对其他用户有效。例子。该线程中提供的解决方案也不起作用。它在这里起作用。尽管我使用的是64位Excel。注意,我在我的
Declare
中删除了
PtrSafe
。我看不到您的确切错误消息,也看不到它发生的位置,因此我无法对此发表评论。细节很重要。我会遇到以下错误:或和,取决于我如何实现该函数。在32位Excel 2010中运行良好。听起来您的VBA实现能力较差。好吧,这可能与我运行脚本的环境有关。我在龙之自然探索15中运行它。