問題解決…って、うそーん… orz

よ、よやく原因が判明しました…。何が悪かったのかというと、マイナーなモードレスダイアログを利用した点 そのウィンドウが処理しないメッセージまで、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:私だけ?^^;