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

时间:2015-06-06 10:22:55

标签: c# winforms

我希望将鼠标光标位置更改为聚焦控制。我通过键盘更改焦点(Enter键)。我怎样才能做到这一点?

1 个答案:

答案 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倾向于拾取错误的形状;我将其设置为DefaultTextBoxes设置为IBeam

我已经对它进行了测试,但是,如上所述,我不会让我的光标跟踪我的焦点..让它成为一个选项,而不是一个功能!