将鼠标光标位置更改为聚焦控制

本文关键字:聚焦 控制 鼠标 光标 位置 | 更新日期: 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

我已经测试过了,它可以工作,但是,如前所述,我宁愿不让光标跟踪我的焦点…让它成为一个选项,而不是一个功能!