2

ダイアログが表示されている場合でもフォーカスを取得できるヘルプフォームをアプリに実装したいと思います。現時点では、焦点を合わせることができない場合は、ヘルプの実際のインスタンスを破棄しますが、それが正しい方法だとは思いません。それで、私のメインアプリケーションのロジックから分離されたフォームを表示するオプションがあるかどうかを尋ねたいと思います。

私が試したこと:

  • AppDomainとして呼び出す(MSDN
  • ヘルプを別のアプリに入れて、プロセスとして呼び出します

どちらの方法でも、ダイアログが呼び出されたときに、help(-form)はフォーカスを取り戻すことができません。

アプリケーション内にヘルプ(-pages)を表示する必要があるため、C#で提供されるヘルプを使用したくありません。

ありがとう

PS:私は.Net2.0を使用しています。

4

1 に答える 1

3

これを行うには、STAスレッドを作成し、を使用Application.Run()してその別のスレッドからフォームを表示します。他のフォーム用に別のメッセージポンプApplication.Run()を作成します。これがそれを分離しているものです。

その場合、フォーム間で通信するときは非常に注意する必要があります。Control.Invoke()最初のフォームから2番目のフォームでUIを変更するメソッドを呼び出すには、またはその他のスレッド間メカニズムを使用する必要があります(その逆も同様です)。

ただし、これを行うと、最初のフォームにモーダルダイアログが表示され、2番目のフォームは引き続きフォーカス可能になります。

それらの間の相対的なZオーダーを指定する方法がないため、2番目のウィンドウが最初のウィンドウの後ろにある可能性があることに注意してください。

2番目のフォームの表示は、次のように実行できます。

private static void ShowIndependentForm()
{
    Thread thread = new Thread(ShowIndependentFormImpl);
    thread.SetApartmentState(ApartmentState.STA);
    thread.IsBackground = true;
    thread.Start();
}

private static void ShowIndependentFormImpl()
{
    Application.Run(new Form2());
}

必要に応じて、ShowIndependentForm()を呼び出すことができます。おそらく作成後のメインフォームからですが、私のテストコードはMain()次のようになります。

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    ShowIndependentForm();
    Application.Run(new Form1());
}

重要

2番目のフォームには独自のメッセージポンプがあるため、Thread.IsBackgroundtrueに設定しない限り、最初のフォームを閉じてもプログラムは閉じられません。Control.Invoke()そうしない場合、プログラムを自動的に閉じる場合は、最初のフォームを閉じるときに2番目のフォームを明示的に閉じる必要があります(または他の方法を使用して2番目のフォームのメソッドを呼び出すことによって)。

于 2013-03-26T09:36:22.790 に答える