C# 轨迹栏一直在窃取我的焦点
有人问了好几次,但我都没法回答。 我的问题是,每次我想要更改轨迹栏的值时,即使在单击窗口的其他部分时,也会保持焦点。当我想使用这些键时,它们只在trackbarbox中工作 我试了什么 -我试图将C# 轨迹栏一直在窃取我的焦点,c#,visual-studio,oop,focus,trackbar,C#,Visual Studio,Oop,Focus,Trackbar,有人问了好几次,但我都没法回答。 我的问题是,每次我想要更改轨迹栏的值时,即使在单击窗口的其他部分时,也会保持焦点。当我想使用这些键时,它们只在trackbarbox中工作 我试了什么 -我试图将CausesValidation/TabStop/topmest设置为false/true -我尝试使用MouseLeave/FocusEnter事件,使用this.focus() -我试着把 protected override bool IsInputKey(Keys keyData) { r
CausesValidation
/TabStop
/topmest
设置为false
/true
-我尝试使用MouseLeave
/FocusEnter
事件,使用this.focus()
-我试着把
protected override bool IsInputKey(Keys keyData)
{
return true;
}
和/或
protected override bool ShowWithoutActivation
{
get { return true; }
}
输入主代码
下面是程序的屏幕截图,以了解我的问题:
通常的方法是在设置
KeyPreview=true
后覆盖OnKeyDown
事件:
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
// your code here..
Text = "Testing: KeyCode" + e.KeyCode;
}
但您也可以使用PreviewKeyDown
事件。确保将表单的KeyPreview
属性设置为true,并向所有可能窃取/接收焦点的控件添加公共事件
由于控件的PreviewKeyDown
事件使用不同的参数,因此需要将事件路由到窗体的KeyDown
事件:
private void CommonPreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
Form1_KeyDown(this, new KeyEventArgs(e.KeyCode));
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
// your code here..
Text = "Testing: KeyCode" + e.KeyCode;
}
您可能希望在代码中连接句柄:
void routeKeys(Control container)
{
foreach (Control ctl in container.Controls)
if (ctl.CanFocus) ctl.PreviewKeyDown += CommonPreviewKeyDown;
}
可以这样称呼:
public Form1()
{
InitializeComponent();
routeKeys(this);
}
当然,您可能希望添加过滤器,以防止表单不处理的密钥路由
这两种技术之间的区别在于,当您覆盖表单时,OnKeyDown
将从任何地方接收keyevents;这将包括例如文本框,其中您的字符和编辑键都被路由到表单
如果不希望,则需要向事件添加筛选器:
if (tb_notes.Focused) return;
if (tb_moreNotes.Focused) return;
if (rtb_edit.Focused) return;
第二种方法是让您决定路由中应包括或排除哪些控件
if (ctl.CanFocus && !(ctl is TextBox || ctl is RichTextBox))
ctl.PreviewKeyDown += CommonPreviewKeyDown;
把焦点放在别的事情上?你无法聚焦表单-没有什么需要聚焦的。作为最后手段,您可以对焦屏幕外的文本框。但我必须对我的表单按键事件做出反应。在该区域(您也有此按键事件)的客户端上也可以使用“鼠标下键/单击”事件,在该事件处理程序中,删除焦点或将焦点设置为另一个控件。@bravobyte因此对文本框上的按键做出反应。控制全部通过一个。嗯,这比我想的要容易。。我只需要更改按键预览。。谢谢你