gpt4 book ai didi

c# - 当控件的顶级父窗口是事件窗口时设置焦点?

转载 作者:行者123 更新时间:2023-11-30 23:03:01 25 4
gpt4 key购买 nike

我正在处理一个 C# 项目。问题在于,当背景窗口不是事件窗口时,诸如鼠标输入之类的背景事件会使背景窗口突出显示。解决策略是在设置此焦点之前添加预防措施。

我的尝试包括以下策略:

control.Focus() 调用之前,我想实现一个涉及 GetActiveWindow() function 的条件以匹配控件的顶级父级的关联窗口句柄。对于后者,我使用 Control.TopLevelControl() .但是,每次我这样做时,我都会得到此属性的 null。根据 MSDN reference 的原因是控件不是窗体上的父级。

尝试的片段:

if (myControl.TopLevelControl.Handle == GetActiveWindow())
{
this.myControl.Focus();
}

代码背景:此代码不归我所有。所以,请原谅我的抽象。我会尽量详细说明。相关控件是一个私有(private)成员自定义布局面板,它继承自 System.Windows.Forms.Panel,其中 DoubleBuffered 属性设置为 true。此控件已添加到继承自 UserControl (Windows 窗体) 的内部分部类。后一个控件已通过公共(public)部分类(也从用户控件继承)上的私有(private)成员 SplitContainer(Windows 窗体)添加。

在此布局面板的用户控件的构造函数中,偶数被添加为:

myLayoutPanel.MouseEnter += this.myLayoutPanel_MouseEnter;

没有我改变的事件看起来像:

private void myLayoutPanel_MouseEnter(object sender, EventArgs e)
{
myLayoutPanel.SuspendLayout();
myLayoutPanel.Focus();
myLayoutPanel.ResumeLayout(false);
}

此外,我手动查看了控件父层次结构的句柄,但始终无法与事件窗口句柄匹配。直觉上,我觉得 GetActiveWindow() 使用互操作性深入研究非托管代码以获取句柄,而顶级属性留在托管区域中,因此有其局限性。不过我可能错了。

有没有人对此有任何想法?

最佳答案

“专注”有两个层次。一个是Control的“焦点”内部形式。一个是Form的“焦点”在桌面上的整个窗口组成中。

Control使用这些成员:

Form使用这些成员:

如果您将焦点设置到表单内部的控件(通过 Focus() ),则焦点仅限于表单,并且表单状态不会更改。如果您还想将焦点设置到表单,则需要激活(通过 Activate() )表单。

重现此行为的最小代码是:

public class MyControl : FlowLayoutPanel {
private TextBox textBox1;
private TextBox textBox2;

public MyControl() {
this.textBox1 = new TextBox();
this.Controls.Add(this.textBox1);

this.textBox2 = new TextBox();
this.Controls.Add(this.textBox2);

this.BackColor = Color.Blue; // not required

this.MouseEnter += this.MyControl_MouseEnter;
}

private void MyControl_MouseEnter(object sender, EventArgs e) {
this.textBox1?.Focus(); // sets focus to the control

var parentForm = this.FindForm();
parentForm?.Activate(); // activates the form
}
}

关于c# - 当控件的顶级父窗口是事件窗口时设置焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50164489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com