将鼠标光标位置更改为聚焦控制
本文关键字:聚焦 控制 鼠标 光标 位置 | 更新日期: 2023-09-27 17:53:43
我想改变鼠标光标的位置集中控制。我通过键盘(回车键)改变焦点。我该怎么做呢?
给你:
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,如下所示::
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter) { goToActive(); return true;}
return base.ProcessCmdKey(ref msg, keyData);
}
更新:如果您不想遵循enter键,而是您的控件的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
。
我已经测试过了,它可以工作,但是,如前所述,我宁愿不让光标跟踪我的焦点…让它成为一个选项,而不是一个功能!