C# 关闭“文件打开”对话框后,如何将主窗体恢复到前面

C# 关闭“文件打开”对话框后,如何将主窗体恢复到前面,c#,C#,我的C#申请从打开一张表格开始。在该表单的构造函数中,我“showDialog”是一个openfiledialog。选择要打开的文件后,openfile对话框关闭,文件被加载,内容显示在主窗体中,但主窗体隐藏在我桌面上每隔一个打开的窗口后面 我必须在任务栏中找到它,并将其聚焦。我刚开始申请,我希望表格有焦点 我已经编写了其他不使用openfiledialog的应用程序,当我启动它们时,主窗体会像您所期望的那样以焦点打开 如何在openfiledialog关闭后使主窗体获得焦点? 我试过了 th

我的C#申请从打开一张表格开始。在该表单的构造函数中,我“showDialog”是一个openfiledialog。选择要打开的文件后,openfile对话框关闭,文件被加载,内容显示在主窗体中,但主窗体隐藏在我桌面上每隔一个打开的窗口后面

我必须在任务栏中找到它,并将其聚焦。我刚开始申请,我希望表格有焦点

我已经编写了其他不使用openfiledialog的应用程序,当我启动它们时,主窗体会像您所期望的那样以焦点打开

如何在openfiledialog关闭后使主窗体获得焦点?

我试过了

  • this.focus(),
  • this.activate(),
  • this.bringtofront()
  • this.topmest=true
它们都没有任何明显的区别

我对这个问题进行了广泛的研究,每个人的建议和说法都是有效的,但它们对我不起作用。有些人暗示我试图使我的身体达到最高点,这违反了所有神圣的东西。然而,我不认为有很多人愿意打开一个应用程序,然后让它的主要表单显示在所有其他内容后面


任何人对如何确保我的表单“在最前面”,最上面,有焦点还有其他想法吗?

当您这样做时,您的应用程序将有一个短暂的时刻,在对话框关闭后,没有窗口可以接收焦点。Windows被迫找到另一个窗口来提供焦点,这将是另一个应用程序的窗口。您的主窗口最终出现,现在位于另一个应用程序窗口的后面


改为在所显示事件的事件处理程序中显示对话框。或者使用样板文件+打开命令。

如果可以,将
ShowDialog
移出构造函数,或者尝试将其放入构造函数中:

this.Shown += OnShown;
然后将
ShowDialog
移动到此处:

private void OnShown(object sender, EventArgs eventArgs)
{
    var result = new OpenFileDialog().ShowDialog();        
}

这将在顶部设置窗口:

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);

private void Form1_Load(object sender, EventArgs e)
{
    ....

    //after your code place the call to the function at the end.       
    SetForegroundWindow(this.Handle);
}

尽管正如汉斯先生所说,你最好换一种设计。

解决方案:
this.Activate()可以工作,但如果从表单加载事件调用。

问题是,从哪个表单打开文件对话框?还有一点代码会有帮助。你是否尝试过隐藏它,然后在文件对话框关闭后,在该窗体的构造函数中执行“显示并聚焦?”i“showDialog”一个openfiledialog。尝试从窗体的Load()或Show()事件调用showDialog(),看看这是否有区别……好吧,我终于想出了如何回答我自己的问题。我用另一种方法遇到了类似的问题。Microsoft在文档中留下了太多重要的信息。此.activate()可以工作,但只有在从表单加载事件执行时才能工作。我在构造函数中最后一次尝试执行它,但它必须在form.load事件中执行。我认为使用user32.dll将旧技术与.net混合在一起,不是最好的方法。我想不起我到底读了些什么,但我相信我读了一些有影响的东西。谢谢你的回答。我相信显示或加载事件都有意义。是否有显示过载的原因?在哪里可以找到关于在哪里做事的信息?在构造函数中打开文件似乎是有意义的,因为这样我可以在构造函数结束时加载数据并初始化所有内容。如何知道在显示的事件或加载事件中应该做一些事情?Microsoft没有将该信息放在文档中。在哪里可以找到该样板文件?