【问题标题】:FindWindow() not workingFindWindow() 不工作
【发布时间】:2018-08-17 18:51:23
【问题描述】:

我正在编写一个需要等待特定窗口打开的小 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

How to use FindWindow to find a visible or invisible window with a partial name in VBA 等类似问题的解决方案似乎也不起作用。

【问题讨论】:

    标签: windows vba winapi user32


    【解决方案1】:

    问题是vbNullString是一个长度为0的字符串,和""一样。当它被编组到非托管代码时,将传递一个指向以空字符结尾的字符数组的非空指针。因为长度为 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")
    

    【讨论】:

    • 这给了我一个类型不匹配的错误。此外,据报道,使用 vbNullString 的语法适用于其他用户。例子。 stackoverflow.com/questions/25098263/…该线程中提供的解决方案也不起作用。
    • 它在这里工作。虽然我使用的是 64 位 Excel。请注意,我在Declare 中删除了PtrSafe。我看不到您的确切错误消息或它发生的位置,因此我无法对此发表评论。细节很重要。
    • 我得到以下错误:i.imgur.com/l8T7SEQ.pngi.imgur.com/IE8eNyi.pngi.imgur.com/YI4UCq1.png 取决于我如何实现该功能。
    • 在 32 位 Excel 2010 中对我来说很好。听起来你的 VBA 实现能力较差。
    • 好的,所以它可能与我运行脚本的环境有关。我在 Dragon NaturallySperaking 15 中运行它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多