Excel 2010 VBA宏关闭特定记事本窗口。(findwindow给出了不匹配类型错误??)

Excel 2010 VBA宏关闭特定记事本窗口。(findwindow给出了不匹配类型错误??),vba,excel-2010,findwindow,Vba,Excel 2010,Findwindow,因此,我正在尝试在我编写的vba宏中关闭窗口/应用程序。许多在线帖子建议使用windows api中的FindWindow 我开始慢了,我试图从宏关闭记事本窗口。(这是我想要的几件事之一,但似乎是最简单的)我找到了一个解决办法,我忘了它贴在哪里了,它又短又甜 Sub CheckNotepad() Dim hwnd As Long hwnd = FindWindow("Notepad", vbNullString) If hwnd Then MsgBox "Notepad is runni

因此,我正在尝试在我编写的vba宏中关闭窗口/应用程序。许多在线帖子建议使用windows api中的
FindWindow

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

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

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

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

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


提前感谢

我想您忘记声明API了。请尝试以下操作(在模块中)


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

我想您忘记声明API了。请尝试以下操作(在模块中)


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

我想您忘记声明API了。请尝试以下操作(在模块中)


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

我想您忘记声明API了。请尝试以下操作(在模块中)


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

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

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

Private声明函数findwindowlib“user32”别名“FindWindowA”(ByVal lpClassName作为字符串,ByVal lpWindowName作为Long)作为Long

有人看到这个问题了吗?我把
放在
ByVal lpWindowName
旁边,显然应该是string。啊

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

Public将PtrSafe函数findwindowlib“user32”别名“FindWindowA”(ByVal lpClassName作为字符串,ByVal lpWindowName作为字符串)声明为LongPtr

以下是我发现的一个链接:

这一个提到VBA7,这一个提到32对64位窗口:


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

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

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

Private声明函数findwindowlib“user32”别名“FindWindowA”(ByVal lpClassName作为字符串,ByVal lpWindowName作为Long)作为Long

有人看到这个问题了吗?我把
放在
ByVal lpWindowName
旁边,显然应该是string。啊

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

Public将PtrSafe函数findwindowlib“user32”别名“FindWindowA”(ByVal lpClassName作为字符串,ByVal lpWindowName作为字符串)声明为LongPtr

以下是我发现的一个链接:

这一个提到VBA7,这一个提到32对64位窗口:


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

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

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

Private声明函数findwindowlib“user32”别名“FindWindowA”(ByVal lpClassName作为字符串,ByVal lpWindowName作为Long)作为Long

有人看到这个问题了吗?我把
放在
ByVal lpWindowName
旁边,显然应该是string。啊

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

Public将PtrSafe函数findwindowlib“user32”别名“FindWindowA”(ByVal lpClassName作为字符串,ByVal lpWindowName作为字符串)声明为LongPtr

以下是我发现的一个链接:

这一个提到VBA7,这一个提到32对64位窗口:


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

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

当我申报时,(我不能
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