0

所以我正在尝试在我正在编写的 vba 宏中关闭窗口/应用程序。网上的许多帖子都建议使用FindWindowwindows api。

我开始很慢,我试图从我的宏中关闭一个记事本窗口。(这是我想要的几件事之一,但它似乎是最简单的)我找到了一个解决方案,我忘记了它是在哪里发布的,它又短又甜。

Sub CheckNotepad()
Dim hwnd As Long
hwnd = FindWindow("Notepad", vbNullString)
If hwnd Then
    MsgBox "Notepad is running, the window handle is " & hwnd
Else
    MsgBox "Notepad is not running"
End If
End Sub

看起来很棒,它是如何获取记事本窗口句柄的开始,从那里我可以找到使用该句柄关闭窗口的代码。但这对我不起作用!

我发现的所有示例都使用 2 个参数,我会说其中一半vbNullString用作第二个参数,其中一些使用字符串作为特定窗口的标题。但这些都不适合我。

唯一有效的是为第二个参数提供 0(我假设这是代替vbNullString),但如果我尝试使用vbnullstring或实际字符串,我会收到类型不匹配错误。如果我尝试使用任何其他数字,则 excel 将停止工作。(出现可爱的“程序已停止工作”消息。

那么,可以给我一些关于为什么会发生这种情况的建议吗?我可以只使用 0,但我猜我的用户会打开其他记事本窗口,所以我希望能够提供一个参数来查找特定的记事本窗口。(它将是一个临时窗口,在宏期间弹出并随后关闭,因为我不希望它打开让他们看到)

提前致谢

4

2 回答 2

2

我想你忘了声明 API。尝试以下(在模块中)

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub CheckNotepad()
Dim hwnd As Long
hwnd = FindWindow("Notepad", "HOUSE.txt - Notepad")
If hwnd Then
    MsgBox "Notepad is running, the window handle is " & hwnd
Else
    MsgBox "Notepad is not running"
End If
End Sub

这将为您提供在记事本中打开的 HOUSE.txt 文件的句柄。

于 2014-01-20T17:11:00.150 回答
1

我刚刚想出了解决方案,它太愚蠢了,我想哭。今天肯定是星期一。

当我输入声明时,(我一生都无法弄清楚它是如何发生的,因为我发现我在哪里得到了代码并且它没有错误)我声明了 api:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) As Long

有人看到这个问题吗?当它显然应该是字符串时,我把它放在As Long旁边。ByVal lpWindowName啊!

顺便说一句,我发现了一篇关于 Windows 7 32 和 64 位/VBA7 兼容性的有趣文章,我想发布。显然,Windows 7 64 位中的大多数 api 函数都应该使用ptrSafe. 因此,例如,如果我使用 64 位,我应该将该 api 声明为:

Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

这是我发现的链接:http: //msdn.microsoft.com/en-us/library/ff700513(v=office.11​​)

那个提到 VBA7,这个提到 32 和 64 位窗口:http ://www.jkp-ads.com/articles/apideclarations.asp

非常感谢您的任何意见和考虑!

于 2014-01-20T17:22:40.933 回答