「モーダレスダイアログからメッセージボックスが起動されている」かの判定(関数)
ってできますか?
GetWindow(GW_CHILD)で取得しようと思ったのですが、うまくいきません。
環境:VC++ (WindowsXp)
> メッセージボックスが起動されている
っていうのはどういう状態をいっていますか?
通常メッセージボックス表示中はアプリケーションに制御が無いので、判定なんかやりようが
ないような気が...
メッセージボックスが起動されている
↓
子ダイアログが起動されている状態を指します。
EnumChildWindowsで子のウィンドウハンドルを取得して、
GetWindowLongでハンドルの種類を特定し、子ダイアログか
判定するようにしたらと・・・悩んでいる最中です。
今、開発ができない状況に陥っているのでなんともいえませんが・・・。
これはダメ、もっといい方法がある、っていうアドバイスよろしくお願いします。
(どちらかとういと、後方のアドバイスがほしいかも・・・(・・;)
いまいちよくわからないけど、素直にダイアログボックス表示中フラグを作っちゃいけ
ないの?
> メッセージボックスが起動されている
> ↓
> 子ダイアログが起動されている状態を指します。
なんか、その一行でぐっと曖昧になった気がします。
その「子ダイアログ」ってのは何者ですか?
MessageBox 関数、ないしはその類似関数(MessageBoxEx、MessageBoxIndirect 等)で表
示されたダイアログに限らないというわけですか?
MessageBox 系以外の API によるダイアログは含むのですか?
自前で DialogBox 等で表示しているものも含むのですか?
モーダルですか? モードレスですか? 両方ですか?
アプリはマルチスレッドですか? シングルスレッドですか?
これ
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200901/09010006.txt
の関連質問だったりしますか?
あと、根本的に。
何のために判定したいんですか?
メッセージボックスは子ウィンドウじゃないから子ウィンドウを探しても見つかるはずない。
メッセージボックスを出している間は閉じるまで待っているわけだから
別のプロセスかスレッドのウィンドウを探しているのかな。
メッセージボックスを出している間は
オーナーウィンドウがマウスクリックなどを受け付けなくなっていることから
判断できるかな?
よくわからん。
それがメッセージボックスによって無効ウィンドウにされたのか
どうかまでは分からんけど。
おはようございます(・・;)
会社暇なもので早く帰ってしまいました。
>なんか、その一行でぐっと曖昧になった気がします。
もうしわけないです(・・;)
>その「子ダイアログ」ってのは何者ですか?
子ダイアログは、ダイアログ(モーダレス・DLL)から起動される全ての子ダイアロ
グ(メッセージボックス・ダイアログ(設定画面)モーダル)です。
> http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200901/09010006.txt
の関連質問だったりしますか?
はい、それに近いと思います。
起動----A.EXE------起動
| |
| |
↓ ↓
B.DLL ←閉じるメッセージ - C.DLL
C.DLLからB.DLLを閉じる時に、B.DLLから子ダイアログが起動されている場合に
落ちるケースがある為、子ダイアログが起動しているか否かの判定が
必要になってきました。
※落ちる原因はわかっていますが、コアな部分なので改修できません。
>アプリはマルチスレッドですか? シングルスレッドですか?
マルチスレッドです。
EnumWindowsでハンドルを列挙して、GetParentで親を確認するのはどうですか?
モードレスダイアログのハンドルを確定出来ないとだめかな。
ん?
DLLのスレッドからダイアログを起動していないですか?
だとすると落ちる可能性が大きいですね。
親ウインドウでなくてもいいですが、ウィンドウハンドルが
確定しているスレッドからダイアログを起動しないと、
「ASSERT(hWnd != NULL);」もしくは、ASSERT(hWnd = NULL);
の例外で落ちる可能性があります。
もちろんDLLの関数を使うのはいいですが、ダイアログの起動は、
ウィンドウハンドルが確定しているスレッドから起動するように
したほうがいいです。
>モードレスダイアログのハンドルを確定出来ないとだめかな。
AfxGetMainWnd()で取得すればいいとおもいます。
>EnumWindowsでハンドルを列挙して、GetParentで親を確認するのはどうですか?
maruさんのいう通りにしたら、うまくいきました!!
みなさん、ありがとうございます(><)/
無事解決しました。