C#/Winforms : Always keep a form focusable

标签 c# winforms focus .net-2.0

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

我尝试过的事情:

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

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

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

谢谢

PS:我使用的是.Net 2.0。

最佳答案

您可以通过创建 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() 或其他方式调用第二个表单中的方法)(如果您愿意)程序自动关闭。

关于C#/Winforms : Always keep a form focusable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15633045/

相关文章:

c# - "Tight"重复键/值匹配

c# - Linq 到 SQL : Updating an aggregate root

c# - c# 中的 GetEnumerator() 是否返回副本或迭代原始源?

c# - 已部署代码超时,但在调试期间不会超时

c# - 无法选择我的表单上的控件

jsf - 如何禁用 Primefaces 对话框中第一个输入的焦点?

c# - 将焦点放回主窗体

c# - 使用 Task 时,如果 ThreadPool 已满/忙会发生什么情况?

android - 在 ListView 中首次输入后,数字编辑文本失去焦点

c# - WinForm 控件绑定(bind)到 List<T> 问题