Mario2さん、レスありがとうございます。
CreateDialogの第1引数にGetDesktopWindow()を指定してはどうでしょう?
こちらでもこの設定で実行してみましたが、どうも状態は変わらないようです。
(こちらのやり方が間違っているかもしれません。いずれにしてもレスを寄せて
頂いて、感謝です。)
それで、以後もあれこれ考えてはみるのですが、
まずメッセージボックスをモーダルダイアログに変えてハンドルを取得出来る
ようにして、
メインウインドウ、及びモードレスウインドウのアクティベイト・イベントで
"もしモーダルダイアログ(※前述のメッセージボックスの代わり)が存在するなら
それにフォーカスを移す"という内容のプログラムを書いてみました。
(ここにソースが表示されます) [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
'
'●アクティベイト・イベント
' (※同様の記述をModelesDialogのアクティベイト・イベントにも書く)
'
Sub MainWnd_Activate(state As Integer, minimized As Integer)
If state<>WA_INACTIVE Then
IsModalDialog()
End If
End Sub
'
'●モーダルダイアログが存在するか調べ、
' もしあるなら、それにフォーカスを移す。
' (SetForegroundWindowで最前面に持ってくる。)
'
Function IsModalDialog() As Byte
IsModalDialog=FALSE
Print
If IsWindow(hModalDialog)<>FALSE Then
Print "モーダルダイアログは存在する。"
IsModalDialog=TRUE
Else
Print "モーダルダイアログは存在しない。"
End If
If IsWindow(hModelessDialog)<>FALSE Then
Print "モードレスダイアログは存在する。"
Else
Print "モードレスダイアログは存在しない。"
End If
If IsModalDialog=TRUE Then
Print "----> モーダルにフォーカスを移します。"
SetForegroundWindow(hModalDialog)
End If
End Function
ただしこの方法でも、モードレスが表示された後での状態は相変わらず
なので、(モードレス、モーダル共に表示されていて、一旦アプリ全体が
非アクティブになってからのメインウインドウへのクリックには反応無し)
試しにモーダルとメインウインドウの親子関係を解消させて実行してみます。
するとメイン、モードレスへのクリックでフォーカスをモーダルに移せることは
移せるのですが、一度はそれぞれのウインドウがアクティブになってから
移るような感じなので一瞬パパッとちらつく感じがあり、更にそれぞれフォーカスを
投げた側が非アクティブなウインドウとしての表示にならないまま(タイトルバーが
青いまま)なので、まるで「アクティブウインドウが二つ存在している」様でかなり
不気味です。
結局、この方法はうまく行かないのではと思いつつ、引き続き考えています。
タスクバーに表示されているメインウインドウへのクリックでは、
モードレスウインドウがあろうが無かろうが
うまくモーダル(※メッセージボックス)がアクティブになってくれるのですが。。。。