我正在进行一个C#项目。问题是,像鼠标进入这样的背景事件会使一个后台窗口弹出并获得焦点,即使它不是活动窗口。解决策略是在设置此焦点之前添加预防步骤。
我的尝试包括以下策略:
在调用
尝试的片段:
此外,我手动观察了控件父层次结构的句柄,但从未能够匹配到活动窗口句柄。直觉上,我感觉
有人对此有什么想法吗?
我的尝试包括以下策略:
在调用
control.Focus()
之前,我想实现一个条件,涉及GetActiveWindow()
函数以匹配控件的顶级父级关联窗口句柄。对于后者,我使用Control.TopLevelControl()
。但是,每次我这样做时,我都会得到null
的属性。根据MSDN参考的原因是该控件未父化在一个表单上。尝试的片段:
if (myControl.TopLevelControl.Handle == GetActiveWindow())
{
this.myControl.Focus();
}
代码背景:此代码不归我所有,所以请原谅我有些抽象。我会尽可能详细地解释。涉及的控件是一个私有成员自定义布局面板,它继承自System.Windows.Forms.Panel,其中DoubleBuffered属性设置为true。将此控件添加到一个内部部分类中,该分类继承自UserControl(Windows窗体)。后者的控件是通过一个私有成员SplitContainer(Windows窗体)添加到一个公共部分类(同样继承自User Control)中。
在此布局面板的用户控件构造函数中,添加了以下事件:
myLayoutPanel.MouseEnter += this.myLayoutPanel_MouseEnter;
没有我的更改,事件看起来像:
private void myLayoutPanel_MouseEnter(object sender, EventArgs e)
{
myLayoutPanel.SuspendLayout();
myLayoutPanel.Focus();
myLayoutPanel.ResumeLayout(false);
}
此外,我手动观察了控件父层次结构的句柄,但从未能够匹配到活动窗口句柄。直觉上,我感觉
GetActiveWindow()
使用互操作性来深入非托管代码以获取句柄,而顶级属性留在托管区域,因此具有其限制。虽然我可能是错的。有人对此有什么想法吗?