Windows 脚本宿主在关闭创建的 window 时终止
Windows Script Host terminates when closing the created window
我为 CreateWindowEx
API 函数创建了一个包装函数,并从 VBScript 中使用它。这是 VBScript:
Dim Result, wcx(10) 'VARIANT ARRAY(10) - WNDCLASSEX
wcx(5) = WINAPI.WinAPI_LoadIcon(NULL, 32516) 'hIcon (IDI_INFORMATION)
wcx(6) = WINAPI.WinAPI_LoadCursor(NULL, 32649) 'hCursor (IDC_HAND)
wcx(7) = 3 'hbrBackground (COLOR_ACTIVECAPTION + 1)
wcx(9) = "DUMMY_CLASS" 'lpszClassName
wcx(10) = WINAPI.WinAPI_LoadIcon(NULL, 32516) 'hIconSm (SAME as hIcon)
'PASS THE VARIANT ARRAY TO THE WRAPPER FUNCTION
Result = WINAPI.WinAPI_RegisterClassEx(wcx)
Dim Style: Style = CLng(&H00CF0000) 'WS_OVERLAPPEDWINDOW
Dim ExStyle: ExStyle = CLng(&H00000100) 'WS_EX_WINDOWEDGE
If CLng(Result) > 0 Then
'CREATE THE WINDOW
Result = WINAPI.WinAPI_CreateWindowEx(ExStyle, "DUMMY_CLASS", "Hello World!", Style, 875, 6, 400, 300, NULL, NULL, NULL, NULL)
WINAPI.WinAPI_ShowWindow Result, 5
WScript.Echo "CreateWindowEx returned 0x" + CStr(UCase(Hex(Result)))
End If
window 按预期创建并显示正常。但我想知道为什么 Windows Script Host 在我单击创建的 window 的关闭按钮时终止。
并且我使用 AutoIt 测试了 CreateWindowEx
,当我关闭创建的 window 时,AutoIt3.exe 没有终止并且它继续 运行 脚本,这与 Windows 不同脚本宿主。
我喜欢保留 Windows 脚本宿主 运行 即使我关闭了创建的 window。
无论如何都没有实现我想要的,我想知道 Windows Script Host 发生这种情况的原因是什么。
我通过如下更改 window 程序解决了这个问题:
LRESULT CALLBACK WindowProc(_In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam) {
switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
/*FOLLOWING LINES WERE REMOVED:
case WM_DESTROY:
PostQuitMessage(0);
break;*/
default: return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
问题的发生是因为我忘记了 Windows Script Host 不是一个标准的 WinForms 应用程序,所以当 window 被销毁时不需要关闭它。
我为 CreateWindowEx
API 函数创建了一个包装函数,并从 VBScript 中使用它。这是 VBScript:
Dim Result, wcx(10) 'VARIANT ARRAY(10) - WNDCLASSEX
wcx(5) = WINAPI.WinAPI_LoadIcon(NULL, 32516) 'hIcon (IDI_INFORMATION)
wcx(6) = WINAPI.WinAPI_LoadCursor(NULL, 32649) 'hCursor (IDC_HAND)
wcx(7) = 3 'hbrBackground (COLOR_ACTIVECAPTION + 1)
wcx(9) = "DUMMY_CLASS" 'lpszClassName
wcx(10) = WINAPI.WinAPI_LoadIcon(NULL, 32516) 'hIconSm (SAME as hIcon)
'PASS THE VARIANT ARRAY TO THE WRAPPER FUNCTION
Result = WINAPI.WinAPI_RegisterClassEx(wcx)
Dim Style: Style = CLng(&H00CF0000) 'WS_OVERLAPPEDWINDOW
Dim ExStyle: ExStyle = CLng(&H00000100) 'WS_EX_WINDOWEDGE
If CLng(Result) > 0 Then
'CREATE THE WINDOW
Result = WINAPI.WinAPI_CreateWindowEx(ExStyle, "DUMMY_CLASS", "Hello World!", Style, 875, 6, 400, 300, NULL, NULL, NULL, NULL)
WINAPI.WinAPI_ShowWindow Result, 5
WScript.Echo "CreateWindowEx returned 0x" + CStr(UCase(Hex(Result)))
End If
window 按预期创建并显示正常。但我想知道为什么 Windows Script Host 在我单击创建的 window 的关闭按钮时终止。
并且我使用 AutoIt 测试了 CreateWindowEx
,当我关闭创建的 window 时,AutoIt3.exe 没有终止并且它继续 运行 脚本,这与 Windows 不同脚本宿主。
我喜欢保留 Windows 脚本宿主 运行 即使我关闭了创建的 window。
无论如何都没有实现我想要的,我想知道 Windows Script Host 发生这种情况的原因是什么。
我通过如下更改 window 程序解决了这个问题:
LRESULT CALLBACK WindowProc(_In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam) {
switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
/*FOLLOWING LINES WERE REMOVED:
case WM_DESTROY:
PostQuitMessage(0);
break;*/
default: return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
问题的发生是因为我忘记了 Windows Script Host 不是一个标准的 WinForms 应用程序,所以当 window 被销毁时不需要关闭它。