tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSetParentとメッセージボックス
記事No9608
投稿日: 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で動的に呼び元のウインドウハンドルが取れればいいのですが・・・

よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: SetParentとメッセージボックス
記事No9609
投稿日: 2009/11/18(Wed) 21:23
投稿者Hongliang
そもそも、SetParent 関数には
> 新しい親ウィンドウと子ウィンドウは、同一アプリケーションに属していなければなりません。
という但し書きがありますけど。
アウトプロセスサーバなら別プロセスになっちゃいます。

[ツリー表示へ]
タイトル解決
記事No9622
投稿日: 2009/11/24(Tue) 22:40
投稿者ほしの
自己解決!
ウィンドウを検索し、自プロセスのウインドウで最前面のフォームのウインドウ
ハンドルを取得し、そのハンドルにメッセージボックスを表示させるという処理
で解決。

[ツリー表示へ]