これは、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 はアプリケーションのメイン スレッドではないことに注意してください。そのため、1 回のアプリケーション実行で何度も作成および破棄できます。非常に単純化されたウィンドウ作成には注意を払わないでください。この特定のウィンドウは、画面に表示されることを意図していません。別のアプリケーションからメッセージを受信する目的でのみ作成されます。これは、CreateWindowEx 関数を呼び出すときに、hWndParent パラメーターの HWND_MESSAGE 値を使用して強調表示されます。