在Microsoft Windows平台上使用VBScript关闭窗口可能会遇到一些挑战。例如,Windows API中的CloseWindow函数仅将窗口最小化,而DestroyWindow函数仅在调用它的线程与创建窗口的线程相同的情况下才有效。因此,如果想要通过VBScript关闭或销毁一个窗口,不能使用DestroyWindow API,因为调用DestroyWindow的线程与要关闭的窗口的线程不同。MSDN文档中指出:“一个线程不能使用DestroyWindow来销毁由不同线程创建的窗口”。尽管网络上有一些文章建议在VB或VBScript中使用DestroyWindow,但至少在测试中,它并不起作用。发现在所有Windows平台上(如Windows 95、98、2000、XP、2003、Vista)都可以使用SendMessage函数与WM_CLOSE消息来关闭窗口,尽管只在XP上进行了测试。
本文的目标是展示如何在Microsoft Windows平台上使用VBScript关闭或销毁窗口。
要实现这一目标,请按照以下步骤操作:
将看到打开的test.txt窗口被关闭和销毁。
创建一个新的ActiveX DLL项目。将以下代码复制并粘贴到模块的代码视图中:
VB.NET
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
VB.NET
Set obj = CreateObject("APIWrapperCOM.APIWrapper")
winHandle = obj.FindWindow("test.txt - Notepad")
obj.KillWindow(winHandle)