这是我基于 win32 api 的代码的摘录:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
void __fastcall TMyThread::Execute(void)
{
WNDCLASSEX wc = {0};
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = class_name.c_str();
if (!RegisterClassEx(&wc))
{
MessageBox(NULL, L"Window Registration Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK);
return;
}
hwnd = CreateWindowEx(0, class_name.c_str(), NULL, 0, 0, 0, 100, 100, HWND_MESSAGE, NULL, wc.hInstance, NULL);
if (hwnd == NULL)
{
MessageBox(NULL, L"Window Creation Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK);
return;
}
MSG msg;
BOOL ret;
while ((ret = GetMessage(&msg, 0, 0, 0)) != 0)
{
if (ret != -1)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
我的问题:
退出消息循环后是否需要进行一些资源清理(例如 CloseHandle)?我经常看到没有任何此类内容的代码示例。这是对的吗?
新创建的窗口能否在第一次调用 GetMessage 函数之前将消息接收到线程队列中(我们假设窗口创建成功,即函数 CreateWindowEx 返回没有错误)?
请记住,TMyThread 不是应用程序的主线程。因此它可以在一个应用程序运行中多次创建和销毁。请不要关注相当简化的窗口创建。这个特定的窗口并不意味着在屏幕上可见。它仅是为了从另一个应用程序接收消息而创建的。这通过在调用 CreateWindowEx 函数时使用 hWndParent 参数的 HWND_MESSAGE 值突出显示。