FindWindow() 不工作

Posted

技术标签:

【中文标题】FindWindow() 不工作【英文标题】:FindWindow() not working 【发布时间】: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 等类似问题的解决方案似乎也不起作用。

【问题讨论】:

【参考方案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 的语法适用于其他用户。例子。 ***.com/questions/25098263/…该线程中提供的解决方案也不起作用。 它在这里工作。虽然我使用的是 64 位 Excel。请注意,我在Declare 中删除了PtrSafe。我看不到您的确切错误消息或它发生的位置,因此我无法对此发表评论。细节很重要。 我得到以下错误:i.imgur.com/l8T7SEQ.png 或 i.imgur.com/IE8eNyi.png 和 i.imgur.com/YI4UCq1.png 取决于我如何实现该功能。 在 32 位 Excel 2010 中对我来说很好。听起来你的 VBA 实现能力较差。 好的,所以它可能与我运行脚本的环境有关。我在 Dragon NaturallySperaking 15 中运行它。

以上是关于FindWindow() 不工作的主要内容,如果未能解决你的问题,请参考以下文章

C#中,findWindow函数怎么不能找到??

什么?pywin32下的FindWindow函数竟然还不支持文本模糊查找?

idea的java类的C图标怎么成了j图标,而且没有代码提示和错误提示

::FindWindow 从服务应用程序失败

使用findwindow找到隐藏窗口使用sendmessage发送wm_close消息,无法关闭。

Java JNA FindWindow() - 查找函数“FindWindow”时出错:找不到指定的过程