2

我想在我的应用程序中实现一个帮助表单,即使显示了一个对话框,它也可以获得焦点。目前,如果无法集中注意力,我会处理我的帮助的实际实例,但我认为那不是正确的方法。所以我想问一下,是否可以选择显示表单,与我的主应用程序的逻辑分开。

我尝试过的事情:

  • 作为 AppDomain 调用 ( MSDN )
  • 将帮助放入单独的应用程序并将其作为一个过程调用

在这两种方式中,当调用对话框时,帮助(-form)都无法获得焦点。

我不想使用 C# 提供的帮助,因为我需要在应用程序中显示帮助(-pages)。

谢谢

PS:我正在使用.Net 2.0。

4

1 回答 1

3

您可以通过创建一个 STA 线程并使用Application.Run()来显示来自该单独线程的表单来做到这一点。Application.Run()将为其他表单创建一个单独的消息泵;这就是让它分开的原因。

如果这样做,则在表单之间进行通信时必须非常小心。您将需要使用Control.Invoke()或其他一些线程间机制来从第一个表单调用第二个表单上的 UI 更改方法(反之亦然)。

但是如果你这样做,那么第一个表单可以显示一个模态对话框,而第二个表单仍然是可聚焦的。

请注意,第二个窗口可能在第一个窗口之后,因为无法指定它们之间的相对 Z 顺序。

显示第二种形式可以这样完成:

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());
}

重要的

因为第二个表单有自己的消息泵,所以关闭第一个表单不会关闭程序,除非您设置Thread.IsBackground为 true。如果不这样做,Control.Invoke()如果您希望程序自动关闭,则必须在第一个表单关闭时显式关闭第二个表单(通过使用或其他方式调用第二个表单中的方法)。

于 2013-03-26T09:36:22.790 回答