Destroying or killing a window using VBScript on Microsoft Windows platforms is a bit tricky. The Windows APIs
DestroyWindow are misleading.
CloseWindow just minimizes a window and
DestroyWindow works only when the
DestroyWindow API is called from the same thread which has created the window you are trying to close. As I want to destroy or kill a window from VBScript, the
DestroyWindow thread will not be the same as of the Window I am trying to destroy or kill. So, I cannot use the
DestroyWindow API. MSDN documents it as "A thread cannot use DestroyWindow to destroy a window created by a different thread". On the web, I found some articles which suggest to use
DestroyWindow from VB or VBScript. At least the
DestroyWindow did not work for me. The presented code is supposed to work on all Windows platforms such as Windows 95, 98, 2000, XP, 2003, Vista, but I have tested on XP only. Of course, Windows API cannot be used directly in VBScript, so I embedded the API in a small COM DLL which I developed using VB 6. Rather than using
DestroyWindow, I used
WM_CLOSE, which works.
How to destroy or kill a window using VBScript on Microsoft Windows platforms.
How To Do It With the Demo Project
Step 1: Download extract the demo project in any folder on your machine.
Step 2: If MSVBVM60.dll is not present in the system32 folder of your machine, download from this link, and then copy the file msvbvm60.dll into the system32 folder of your machine.
Step 3: Double click the file reg.bat from the location where you extracted the demo project.
Step 4: Double click on the test.txt file.
Step 5. Double click on the file destroy_window.vbs.
You will find that the open window of test.txt will be closed and destroyed.
Source Code for the COM DLL
Create a new ActiveX DLL project. Copy and paste the following code in code view of the module:
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)
Public Function KillWindow(ByVal winHandle As Long) As Long
KillWindow = FxSendMessage(winHandle, WM_CLOSE, 0, 0)
VBScript to Destroy or Kill the Window
Set obj = CreateObject("APIWrapperCOM.APIWrapper")
winHandle = obj.FindWindow("test.txt - Notepad")
Registration of the COM DLL and Dependency
As mentioned above, the Visual Basic generated COM DLL has dependency on MSVBVM60.dll which can be freely downloaded from the above link. Once the MSVBVM60.dll file is present in the system32 folder of your machine, you can use the regsvr32 command to register the DLL. This command is included in the reg.bat file in the demo project.
- 28th November, 2006: Initial post