メッセージボックス起動中か否かの判定 – プログラミング – Home

メッセージボックス起動中か否かの判定
 
通知
すべてクリア

[解決済] メッセージボックス起動中か否かの判定


ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

「モーダレスダイアログからメッセージボックスが起動されている」かの判定(関数)
ってできますか?
GetWindow(GW_CHILD)で取得しようと思ったのですが、うまくいきません。

環境:VC++ (WindowsXp)


引用未解決
トピックタグ
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> メッセージボックスが起動されている
っていうのはどういう状態をいっていますか?
通常メッセージボックス表示中はアプリケーションに制御が無いので、判定なんかやりようが
ないような気が...


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

メッセージボックスが起動されている
    ↓
子ダイアログが起動されている状態を指します。

EnumChildWindowsで子のウィンドウハンドルを取得して、
GetWindowLongでハンドルの種類を特定し、子ダイアログか
判定するようにしたらと・・・悩んでいる最中です。
今、開発ができない状況に陥っているのでなんともいえませんが・・・。
これはダメ、もっといい方法がある、っていうアドバイスよろしくお願いします。
(どちらかとういと、後方のアドバイスがほしいかも・・・(・・;)


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

いまいちよくわからないけど、素直にダイアログボックス表示中フラグを作っちゃいけ
ないの?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> メッセージボックスが起動されている
>     ↓
> 子ダイアログが起動されている状態を指します。

なんか、その一行でぐっと曖昧になった気がします。

その「子ダイアログ」ってのは何者ですか?
MessageBox 関数、ないしはその類似関数(MessageBoxEx、MessageBoxIndirect 等)で表
示されたダイアログに限らないというわけですか?
MessageBox 系以外の API によるダイアログは含むのですか?
自前で DialogBox 等で表示しているものも含むのですか?
モーダルですか? モードレスですか? 両方ですか?
アプリはマルチスレッドですか? シングルスレッドですか?
これ
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200901/09010006.txt
の関連質問だったりしますか?

あと、根本的に。
何のために判定したいんですか?


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

メッセージボックスは子ウィンドウじゃないから子ウィンドウを探しても見つかるはずない。


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

メッセージボックスを出している間は閉じるまで待っているわけだから
別のプロセスかスレッドのウィンドウを探しているのかな。

メッセージボックスを出している間は
オーナーウィンドウがマウスクリックなどを受け付けなくなっていることから
判断できるかな?
よくわからん。
それがメッセージボックスによって無効ウィンドウにされたのか
どうかまでは分からんけど。


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

おはようございます(・・;)
会社暇なもので早く帰ってしまいました。

>なんか、その一行でぐっと曖昧になった気がします。
もうしわけないです(・・;)

>その「子ダイアログ」ってのは何者ですか?
子ダイアログは、ダイアログ(モーダレス・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から子ダイアログが起動されている場合に
落ちるケースがある為、子ダイアログが起動しているか否かの判定が
必要になってきました。
※落ちる原因はわかっていますが、コアな部分なので改修できません。

>アプリはマルチスレッドですか? シングルスレッドですか?
マルチスレッドです。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

EnumWindowsでハンドルを列挙して、GetParentで親を確認するのはどうですか?
モードレスダイアログのハンドルを確定出来ないとだめかな。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

 ん?
 DLLのスレッドからダイアログを起動していないですか?
だとすると落ちる可能性が大きいですね。
 親ウインドウでなくてもいいですが、ウィンドウハンドルが
確定しているスレッドからダイアログを起動しないと、
「ASSERT(hWnd != NULL);」もしくは、ASSERT(hWnd = NULL);
の例外で落ちる可能性があります。
もちろんDLLの関数を使うのはいいですが、ダイアログの起動は、
 ウィンドウハンドルが確定しているスレッドから起動するように
したほうがいいです。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>モードレスダイアログのハンドルを確定出来ないとだめかな。
AfxGetMainWnd()で取得すればいいとおもいます。


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

>EnumWindowsでハンドルを列挙して、GetParentで親を確認するのはどうですか?
maruさんのいう通りにしたら、うまくいきました!!

みなさん、ありがとうございます(><)/
無事解決しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました