我的C#应用程序首先打开一个表单。在该表单的构造函数中,我“showDialog”是一个openfiledialog。选择要打开的文件后,openfile对话框关闭,文件加载,内容显示在主窗体中,但主窗体隐藏在桌面上的每个其他打开窗口后面。
我必须在任务栏中找到它并将其聚焦。我刚刚启动了应用程序,我希望表单具有焦点。
我已经编写了其他不使用openfiledialog的应用程序,当我启动它们时,主窗体会按照您的预期打开焦点。
如何在openfiledialog关闭后让主窗体获得焦点?
我试过了
this.focus(),
this.activate(),
this.bringtofront();
this.TopMost = true
; 他们都没有任何明显的区别。
我已经广泛研究了这个问题,这是每个人都建议和说工作的事情,但它们对我不起作用。有些人暗示我试图让自己的形式最顶端,从而侵犯了所有神圣的东西。但是,我不认为很多人会想要打开一个应用程序,并且主要表单显示在其他所有内容之后。
任何人都有任何关于如何确保我的表格“在前面”,最重要的,有焦点的任何其他想法?
答案 0 :(得分:1)
当您这样做时,您的应用程序将有一个短暂的时刻,在对话框关闭后, no 窗口可用于接收焦点。 Windows被迫找到另一个窗口来关注,这将是另一个应用程序的窗口。您的主窗口最终会出现,现在位于其他应用程序窗口的后面。
在Shown事件的事件处理程序中显示对话框。或者使用样板文件+打开命令。
答案 1 :(得分:0)
如果可以,请将ShowDialog
移出构造函数,或尝试将其放在构造函数中:
this.Shown += OnShown;
并将您的ShowDialog
移至此处:
private void OnShown(object sender, EventArgs eventArgs)
{
var result = new OpenFileDialog().ShowDialog();
}
答案 2 :(得分:0)
这会将窗口设置在顶部:
[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);
}
正如汉斯先生说的那样,并且很好地用另一种设计做得更好。
答案 3 :(得分:0)
解决方案:this.Activate();
可以工作,但是如果从表单Load事件调用。