我有一个WinForms项目,它有一个显示非模态对话框的最顶层主窗体。如果对话框失去了输入焦点,我需要隐藏(而不是关闭)对话框-无论是什么原因(用户单击了主窗体,切换到另一个应用程序,等等)。下面的项目源代码部分显示了所发生的事情:
public partial class MainForm : Form
{
Form _dialog = new Form();
public MainForm()
{
InitializeComponent();
this.TopMost = true;
this.Text = "Main Form";
_dialog.Text = "Dialog";
_dialog.Owner = this;
_dialog.TopMost = true;
_dialog.Deactivate += Dialog_Deactivate;
_dialog.FormClosing += Dialog_FormClosing;
}
private void Dialog_Deactivate(object sender, EventArgs e)
{
_dialog.Hide();
}
private void Dialog_FormClosing(object sender, FormClosingEventArgs e)
{
_dialog.Hide();
e.Cancel = true;
}
private void ButtonShowDialog_Click(object sender, EventArgs e)
{
_dialog.Show();
}
}
我试图解决的主要问题如下:如果用户打开对话框并单击主窗体,如下面的屏幕截图所示
,对话框如预期的那样隐藏,但主窗体失去焦点,另一个先前处于活动状态的应用程序在后台变为活动状态-下一个屏幕截图中的Windows资源管理器:
这是Windows或WinForms中的已知问题吗?如何使主窗体在此构造中不失去焦点?
2条答案
按热度按时间u91tlkcl1#
问题似乎是当单击主窗体时,它触发了
WM_WINDOWPOSCHANGING
事件。由于子对话框是打开的,因此hwndInsertAfter
句柄是子对话框。但是在Dialog_Deactivate
中,子对话框是隐藏的,这导致主窗体落在所有其他窗口后面,因为hwndInsertAfter
句柄不再是可见窗口。可能的解决方案是1)在调用
Hide()
之前将子对话框所有者设置为null,或者2)使用不同的事件,如LostFocus
,即:b1uwtaje2#
在隐藏对话框后,尝试在主窗体上调用Activate(),即: