お世話になります。
現在 WinXP VC++.Net SDK でアプリケーションを作成しています。
アプリケーションはタスクトレイにアイコンを表示し、
ウィンドウは表示していません。
WM_DESTROY メッセージを受け取ったときに PostQuitMessage(0) を
コールしているのですが、メッセージループの GetMessage 関数で
-1 が返ってしまいます。
GetLastError 関数で取得したエラー内容はウィンドウのハンドルが
無効とのことなんですが、PostQuitMessage の直前に SendMessage で
メッセージを送っても、きちんとウィンドウプロシージャでメッセージを
受け取ります。
これは PostQuitMessage(0) 中にウィンドウハンドルが無効になってしまう
ということなのでしょうか?
ご回答、よろしくお願いします。
GetMessageの第2引数に、その破棄されたウィンドウを指定してるとか…
WM_DESTROYが送られる。
PostQuitMessage(0)でメッセージキューにWM_QUITを置く。
↓
WM_NCDESTROYが送られる
↓
システムがウィンドウを破棄
↓
GetMessageがWM_QUITを拾おうとする
↓
第2引数にその破棄されたウィンドウを指定していた
↓
ウィンドウハンドル無効
LLPさん、ご回答ありがとうございます。
GetMessage の第2引数は WinMain 関数内で作成したウィンドウハンドルを使用してお
ります。
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,
LPSTR lpszCmdLine, int cmdShow)
{
HWND hWnd;
MSG msg;
int nRet;
hWnd = InitWindow(hInst); // ウィンドウを作成しハンドルを返す
if (!hWnd) return;
while ( (nRet = GetMessage(&msg, hWnd, 0, 0)) )
{
if (nRet == -1)
{
※ DelIcon(hWnd); // タスクトレイからアイコンを削除
return -1;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DelIcon(hWnd); // タスクトレイからアイコンを削除
return (int)(msg.wParam);
}
としていまして、一般的なメッセージループだと思うのですが、
何か問題がありますでしょうか?
それと、ウィンドウハンドルが無効だというエラーが出ているのにも関わらず
※のところで、ウィンドウハンドルを使用してタスクトレイからアイコンを
削除できてしまいます。
すいませんが、ご回答よろしくお願いします。
> while ( (nRet = GetMessage(&msg, hWnd, 0, 0)) )
普通はNULLを指定すると思うのですが。
これだとhWndのメッセージしか処理できないけど、いいのでしょうか?
子ウィンドウやモードレスダイアログを作っても機能しませんよ。
>※のところで、ウィンドウハンドルを使用してタスクトレイからアイコンを
>削除できてしまいます。
タスクトレイは渡されたウィンドウハンドルと登録されているアイコン情報を
比較して削除しているだけです。
ハンドルが無効かどうかは関係ありません。
LLPさん、ご回答ありがとうございます。
>普通はNULLを指定すると思うのですが。
そうでした。すっかり忘れておりました。
GetMessage(&msg, NULL, 0, 0)
としましたら、きちんと処理されました。
>タスクトレイは渡されたウィンドウハンドルと登録されているアイコン情報を
>比較して削除しているだけです。
>ハンドルが無効かどうかは関係ありません。
そうだったのですか。勉強になりました。
LLPさんのおかげで解決しました。
ありがとうございました。