views:

514

answers:

4

I want to run a common KeyDown even handler for all the controls available on a form. any way I can accomplish that?

To be more clear, My intention is to detect Enter key whenever it's pressed and move the focus from the current control to the one with next TabIndex.

So, I need to know how I can accomplish that..

+1  A: 

Override the form's ProcessCmdKey method.

SLaks
+1  A: 

You'll have to avoid getting in the way of regular use of the Enter key. This should be close:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == Keys.Enter && this.AcceptButton == null && this.ActiveControl != null) {
    TextBoxBase box = this.ActiveControl as TextBoxBase;
    if (box == null || !box.Multiline) {
      // Not a dialog, not a multi-line textbox; we can use Enter for tabbing
      this.SelectNextControl(this.ActiveControl, true, true, true, true);
      return true;
    }
  }
  return base.ProcessCmdKey(ref msg, keyData);
}
Hans Passant
A: 

are you using WinForms or WPF?

Michael Baldry
I'm using Winforms..
Bibhas
A: 

Hey, working cool.. actually ProcessCmdKey doesn't occur under the form events list, so couldn't use it earlier. ^_^

I Edited a bit and modified it to detect if any buttons are available and if there is, it'll not move focus, instead press the button..

Button b = this.ActiveControl as Button;
        if (keyData == Keys.Enter && this.AcceptButton == null && this.ActiveControl != null && !this.ActiveControl.Equals(b))
        {

            TextBoxBase box = this.ActiveControl as TextBoxBase;

            if (box == null || !box.Multiline)
            {
                // Not a dialog, not a multi-line textbox; we can use Enter for tabbing
                this.SelectNextControl(this.ActiveControl, true, true, true, true);
                return true;
            }
        }
        return base.ProcessCmdKey(ref msg, keyData);

But whatif I want to press the button once and then move again to the new control? Is there any way to invoke this ProcessCmdKey manually?

Bibhas