VBScript 中的 DestroyWindow






4.83/5 (5投票s)
使用 VBScript 销毁或杀死一个窗口。
引言
在 Microsoft Windows 平台上使用 VBScript 销毁或关闭窗口有点棘手。Windows API CloseWindow
和 DestroyWindow
具有误导性。CloseWindow
只是最小化窗口,而 DestroyWindow
仅当从创建窗口的同一线程调用 DestroyWindow
API 时才有效。由于我希望从 VBScript 销毁或关闭窗口,因此 DestroyWindow
线程将与我尝试销毁或关闭的窗口的线程不同。因此,我无法使用 DestroyWindow
API。MSDN 文档将其描述为“一个线程不能使用 DestroyWindow 销毁由不同线程创建的窗口”。我在网上找到了一些文章建议从 VB 或 VBScript 使用 DestroyWindow
。至少 DestroyWindow
对我不起作用。所提供的代码应该适用于所有 Windows 平台,例如 Windows 95、98、2000、XP、2003、Vista,但我只在 XP 上进行了测试。当然,VBScript 无法直接使用 Windows API,因此我将 API 嵌入到一个使用 VB 6 开发的小型 COM DLL 中。我没有使用 DestroyWindow
,而是使用了带有 WM_CLOSE
的 SendMessage
,这有效。
目标
如何在 Microsoft Windows 平台上使用 VBScript 销毁或关闭窗口。
使用演示项目操作方法
步骤 1:将演示项目下载并提取到您机器上的任何文件夹中。
步骤 2:如果您的机器的 system32 文件夹中没有 MSVBVM60.dll,请从 此链接 下载,然后将文件 msvbvm60.dll 复制到您机器的 system32 文件夹中。
步骤 3:双击您提取演示项目的位置中的文件 reg.bat。
步骤 4:双击文件 test.txt。
步骤 5:双击文件 destroy_window.vbs。
您会发现打开的 test.txt 窗口将被关闭并销毁。
COM DLL 的源代码
创建一个新的 ActiveX DLL 项目。将以下代码复制并粘贴到模块的代码视图中
Option Explicit
Private Declare Function FxFindWindow Lib "user32" Alias "FindWindowA" _
(ByVal szClassName As String, ByVal szWindow As String) As Long
Private Declare Function FxSendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam _
As Long, ByVal lParam As Long) As Long
Private Const WM_CLOSE = &H10
Public Function FindWindow(ByVal CaptionString As String) As Long
FindWindow = FxFindWindow(vbNullString, CaptionString)
End Function
Public Function KillWindow(ByVal winHandle As Long) As Long
KillWindow = FxSendMessage(winHandle, WM_CLOSE, 0, 0)
End Function
VBScript 以销毁或关闭窗口
Set obj = CreateObject("APIWrapperCOM.APIWrapper")
winHandle = obj.FindWindow("test.txt - Notepad")
obj.KillWindow(winHandle)
COM DLL 的注册和依赖项
如上所述,Visual Basic 生成的 COM DLL 依赖于 MSVBVM60.dll,可以从上面的链接免费下载。一旦 MSVBVM60.dll 文件存在于您机器的 system32 文件夹中,您可以使用 regsvr32 命令注册 DLL。此命令包含在演示项目中的 reg.bat 文件中。
历史
- 2006 年 11 月 28 日:初始发布