タイトル | : SetParentとメッセージボックス |
記事No | : 9608 |
投稿日 | : 2009/11/18(Wed) 21:09 |
投稿者 | : ほしの |
こんにちは、いつも拝見させていただいております。 大変参考にさせていただいております。
メッセージボックスの挙動なのですが、普通は呼び出すと、モーダルになって呼び出し 元の画面がロックされますよね。 ところが、A.exeとB.exeを作成し、A.exeを額縁のようにして、B.exeをWinAPIの SetParent()で貼り付けます。
そうするとあら不思議。
B.exeから呼び出したメッセージボックスがモードレスになってしまいます。 こうなると、B.exeの画面がメッセージ表示中も触れてしまうので、いろいろと不都合 が出てしまいます・・・ ちなみに、ActiveXExeです。
組み込みのMsgBoxの不具合かと思い、B.exeのグローバルモジュールに、MsgBoxと同じ 名前の関数を作り、中でWinAPIのMessageBox()を呼び出すようにしました。 第1引数にWinAPIのGetActiveWindow()でとってきたウインドウハンドルをセットした ところ、うまくいったかのように見えましたが、A.exeがアクティブになっている状態で 全く別のウインドウ(Excelとか)を重ねてしまうと、GetActiveWindow()の返り値が0に なってしまい、メッセージボックスがモードレスになってしまいました。 MessageBox()のスタイルにMB_SYSTEMMODALやMB_TASKMODALを指定しても、モーダルに なる気配がありませんでした。
この方法で対応するとした場合は、第1引数に適切なウインドウハンドルを設定してや らないといけなそうな感じなのですが、何か有効な取り方はありますでしょうか?
ちなみに、B.exeはサブフォームも展開したりするので、サブフォームからメッセージを 出した場合はサブフォームのウインドウハンドルをセットする必要があるかと思います。
B.exeで定義したMsgBox()に引数を追加して呼び出し元のウインドウハンドルを渡して やれれば問題は解決するのかもしれませんが、B.exeが大量にあるので、対応しきれない 状態なのです;
なんとかWinAPIで動的に呼び元のウインドウハンドルが取れればいいのですが・・・
よろしくお願いいたします。
|