よ、よやく原因が判明しました…。何が悪かったのかというと、マイナーなモードレスダイアログを利用した点 そのウィンドウが処理しないメッセージまで、PSM_ISDIALOGMESSAGE で投げていたから …のようです。
モードレスダイアログだと [http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_isdialogmessage.asp?frame=true:title=IsDialogMessage]
が必要になりますが、プロパティシートの場合は専用に [http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/propsheet/messages/psm_isdialogmessage.asp?frame=true:title=PSM_ISDIALOGMESSAGE]
を利用して IsDialogMessage
っぽい事を行わないとなりません。
IsDialogMessage の場合は
MSG msg;
::GetMessage(&msg);
// ↓とりあえず投げて判断しようぜ!
if(!::IsDialogMessage(hDlg, &msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
なんて、直接投げてメッセージが処理されるか判断しちゃうようなコードをを書いてみちゃったりしますが *1 これと似たり寄ったりで
MSG msg;
::GetMessage(&msg);
// ↓とりあえず投げて判断しようぜ!
if(!::SendMessage(hProp, PSM_ISDIALOGMESSAGE, NULL, (LPARAM)&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
なんて書いてみると、ダイアログ自体は動作するものの、(少なからず)エディットコントロールへのキーボードからの日本語入力が化けるようです。 というわけで
MSG msg;
::GetMessage(&msg);
// ↓しっかり判断しましょう :P
if((hProp == msg.hwnd) || !::SendMessage(hProp, PSM_ISDIALOGMESSAGE, NULL, (LPARAM)&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
なんて感じに、しっかりそのウィンドウのメッセージだけを送るようにしたところ、期待通りの動作をするようになりました。 いやーよかった一安心!
…ですが、個人的には Windowsのバグのよーな気がしないでもないのですが…(爆 ^^;
つか、モードレスのプロパティシート使いづらいよぅ…。 [http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/propsheet/messages/psm_getcurrentpagehwnd.asp?frame=true:title=PSM_GETCURRENTPAGEHWND]
で、終了確認しろとかって、いかにも力技な気が…
*1:私だけ?^^;