PostQuitMessage – プログラミング – Home

通知
すべてクリア

[解決済] PostQuitMessage


ゆう
 ゆう
(@ゆう)
ゲスト
結合: 24年前
投稿: 114
Topic starter  

お世話になります。

現在 WinXP VC++.Net SDK でアプリケーションを作成しています。

アプリケーションはタスクトレイにアイコンを表示し、
ウィンドウは表示していません。
WM_DESTROY メッセージを受け取ったときに PostQuitMessage(0) を
コールしているのですが、メッセージループの GetMessage 関数で
-1 が返ってしまいます。
GetLastError 関数で取得したエラー内容はウィンドウのハンドルが
無効とのことなんですが、PostQuitMessage の直前に SendMessage で
メッセージを送っても、きちんとウィンドウプロシージャでメッセージを
受け取ります。

これは PostQuitMessage(0) 中にウィンドウハンドルが無効になってしまう
ということなのでしょうか?

ご回答、よろしくお願いします。


引用未解決
トピックタグ
LLP
 LLP
(@LLP)
ゲスト
結合: 22年前
投稿: 2
 

GetMessageの第2引数に、その破棄されたウィンドウを指定してるとか…

WM_DESTROYが送られる。
PostQuitMessage(0)でメッセージキューにWM_QUITを置く。

WM_NCDESTROYが送られる

システムがウィンドウを破棄

GetMessageがWM_QUITを拾おうとする

第2引数にその破棄されたウィンドウを指定していた

ウィンドウハンドル無効


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 24年前
投稿: 114
Topic starter  

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);
}
としていまして、一般的なメッセージループだと思うのですが、
何か問題がありますでしょうか?

それと、ウィンドウハンドルが無効だというエラーが出ているのにも関わらず
※のところで、ウィンドウハンドルを使用してタスクトレイからアイコンを
削除できてしまいます。

すいませんが、ご回答よろしくお願いします。


返信引用
LLP
 LLP
(@LLP)
ゲスト
結合: 22年前
投稿: 2
 

> while ( (nRet = GetMessage(&msg, hWnd, 0, 0)) )

普通はNULLを指定すると思うのですが。
これだとhWndのメッセージしか処理できないけど、いいのでしょうか?
子ウィンドウやモードレスダイアログを作っても機能しませんよ。

>※のところで、ウィンドウハンドルを使用してタスクトレイからアイコンを
>削除できてしまいます。

タスクトレイは渡されたウィンドウハンドルと登録されているアイコン情報を
比較して削除しているだけです。
ハンドルが無効かどうかは関係ありません。


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 24年前
投稿: 114
Topic starter  

LLPさん、ご回答ありがとうございます。

>普通はNULLを指定すると思うのですが。
そうでした。すっかり忘れておりました。
GetMessage(&msg, NULL, 0, 0)
としましたら、きちんと処理されました。

>タスクトレイは渡されたウィンドウハンドルと登録されているアイコン情報を
>比較して削除しているだけです。
>ハンドルが無効かどうかは関係ありません。
そうだったのですか。勉強になりました。

LLPさんのおかげで解決しました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました