2017-05-17 6 views
1
class Form1 : Form 
{ 
    ... 
    void SoSomething() 
    { 
     var f2 = new Form2(); 
     f2.ShowDialog(null); 
    } 
    void SoSomethingElse() 
    { 
     var f2 = new Form2(); 
     f2.ShowDialog(this); 
    } 
} 

を設定されていることは、これらの2つの方法が同一であり、ShowDialog思わ自動的ShowDialogに設定されていない場合は、それを呼び出したフォーム(引数にその所有者を設定しているようだですnull)。Form.ShowDialogは私の現在のテストから

しかし、私はこのようなフォームを作成するconsole-appを持っています。その場合、ダイアログの所有者が何であるか不思議です。 nullShowDialogを提供するときに、正確に何が起こっているかを説明するドキュメントは見つかりませんでした。

+0

[This](https://msdn.microsoft.com/en-us/library/system.windows.forms.form.owner(v = vs.110).aspx)は、私が知っている唯一のものです所有者の関係。所有者のいないダイアログは独立したウィンドウのように振る舞い、何の問題も起こらないはずです。 –

+0

ダイアログは常に所有者がいなければなりません。指定していない場合は、そのプロセスが所有している現在アクティブなウィンドウを選んで1つを探します。これは、このようなコードを脆弱にし、適切な所有者を見つけることができず、デスクトップウィンドウに戻らなければならないという不安です。それは悪いです、あなたのアプリは、ダイアログが閉じるときにフォアグラウンドを失います。それ以降に作成するウィンドウは、他のプロセスが所有するウィンドウで覆われていることもあります。 –

答えて

1

Reference Sourceから、プログラムがアクティブなウィンドウを取得しようとしているようです。何もありませんコンソールアプリケーションの場合

IntPtr hWndActive = UnsafeNativeMethods.GetActiveWindow(); 
IntPtr hWndOwner = owner == null ? hWndActive : Control.GetSafeHandle(owner); 

hWndActiveIntPtr.Zeroownerがnullです。フォームにはオーナーがいません。

が効果的に、これはそれ以来ShowDialog()としてthe same behaviorを持っているだけで呼び出します。

public DialogResult ShowDialog() { 
    return ShowDialog(null); 
} 

だから、基本的に、これは所有者のない単なるフォームです。特にない。これは独立したウィンドウのように動作します。

注:Application.Run(new ...());を使用せずにコンソールアプリケーションからフォームを開くべきではありません。Win32メッセージループが起動していることを確認します。

+0

非常に興味深い、その答えに感謝します。したがって、 'unsafeNativeMethods.GetActiveWindow()'は、少なくともwinforms-appの 'ShowDialog(null)'と 'ShowDialog(myForm)'が同じ動作をする理由です。 – HimBromBeere

+0

はい、それは..... –

関連する問題