我希望将鼠标光标位置更改为聚焦控制。我通过键盘更改焦点(Enter键)。我怎样才能做到这一点?
答案 0 :(得分:4)
你走了:
void goToActive()
{
Control ctl = this.ActiveControl;
this.Cursor = new Cursor(Cursor.Current.Handle);
if (ctl != null) Cursor.Position = ctl.PointToScreen(new Point(3,3));
}
要从任何地方捕获导航键,请将ProcessCmdKey覆盖为show here ..:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter) { goToActive(); return true;}
return base.ProcessCmdKey(ref msg, keyData);
}
更新:如果您不遵循Enter-Key,而是关注控件的Enter
事件,请按以下步骤操作:
我们在Form.Shown
事件中注册所有控件:
private void Form1_Shown(object sender, EventArgs e)
{
registerAllControls(this);
}
这个管理员递归控制所有控件。您可能希望根据您的需要排除一些,可能会检查名称,类型或Tag
..:
void registerAllControls(Control ctl)
{
ctl.Enter += ControlReceivedFocus;
foreach (Control ct in ctl.Controls)
{
registerAllControls(ct);
}
}
我们只在我们不在这里时调用修改后的goToActive
函数..:
void ControlReceivedFocus(object sender, EventArgs e)
{
if (!((sender as Control).ClientRectangle
.Contains(PointToClient(MousePosition))))
{
goToActive(sender);
}
}
我修改了函数以包含调用控件,以使事情变得更容易..:
void goToActive(object sender)
{
Control ctl = sender as Control;
this.Cursor = new Cursor(Cursor.Current.Handle);
Cursor.Position = ctl.PointToScreen(new Point(3, 3));
if (sender is TextBox) Cursor = Cursors.IBeam;
else Cursor = Cursors.Default;
}
请注意,Cursor
倾向于拾取错误的形状;我将其设置为Default
或TextBoxes
设置为IBeam
。
我已经对它进行了测试,但是,如上所述,我不会让我的光标跟踪我的焦点..让它成为一个选项,而不是一个功能!