2015-06-06 3 views
2

Я хочу изменить положение курсора мыши на сфокусированное управление. Я меняю фокусы на клавиатуру (клавиша Enter). Как я могу это сделать?Изменение положения курсора мыши на сфокусированное управление

+0

Я добавил версию, которая использует событие Enter для ваших элементов управления. – TaW

ответ

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); 
} 

Update: Если вы не хотите следовать вступающим Key but the Enter События из ваших мер контроля, вот как это сделать:

Мы регистрируем все элементы управления i п Form.Shown событие:

private void Form1_Shown(object sender, EventArgs e) 
{ 
    registerAllControls(this); 
} 

Это regisers все элементы управления рекурсивно. Вы можете Exlude некоторые в зависимости от потребностей, может быть проверки названия, типа или 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.

Я протестировал его, он работает, но, как отмечено, я бы предпочел, чтобы мой курсор не отслеживал мой фокус. Сделайте его опцией, а не особенностью!

+0

Как определить изменение фокуса в форме для использования этого кода? –

+0

С помощью переопределения [ProcessCmdKey] (http://stackoverflow.com/questions/5951496/how-do-i-capture-keys-f1-regardless-of-the-focused-control-on-a-form) .. – TaW

+0

Но это на ключевом событии, а не на фокусировке! Некоторые, где фокус меняется, когда условие в 'input' было истинным. Как в 'textBox' года, если символы будут 4 цифры, он будет автоматически фокусироваться на следующем входе –

Смежные вопросы