2010-07-14 34 views

Respuesta

2

MessageFilters puede ayudarlo en este caso.

public class KeystrokMessageFilter : System.Windows.Forms.IMessageFilter 
    { 
     public KeystrokMessageFilter() { } 

     #region Implementation of IMessageFilter 

     public bool PreFilterMessage(ref Message m) 
     { 
      if ((m.Msg == 256 /*0x0100*/)) 
      { 
       switch (((int)m.WParam) | ((int)Control.ModifierKeys)) 
       { 
        case (int)(Keys.Control | Keys.Alt | Keys.K): 
         MessageBox.Show("You pressed ctrl + alt + k"); 
         break; 
        //This does not work. It seems you can only check single character along with CTRL and ALT. 
        //case (int)(Keys.Control | Keys.Alt | Keys.K | Keys.P): 
        // MessageBox.Show("You pressed ctrl + alt + k + p"); 
        // break; 
        case (int)(Keys.Control | Keys.C): MessageBox.Show("You pressed ctrl+c"); 
         break; 
        case (int)(Keys.Control | Keys.V): MessageBox.Show("You pressed ctrl+v"); 
         break; 
        case (int)Keys.Up: MessageBox.Show("You pressed up"); 
         break; 
       } 
      } 
      return false; 
     } 

     #endregion 


    } 

En su C# WindowsForm, registrar el MessageFilter para la captura de teclado de golpes y combinaciones.

public partial class Form1 : Form 
{ 
    KeystrokMessageFilter keyStrokeMessageFilter = new KeystrokMessageFilter(); 

    public Form1() 
    { 
     InitializeComponent(); 
    }  
    private void Form1_Load(object sender, EventArgs e) 
    { 
     Application.AddMessageFilter(keyStrokeMessageFilter); 
    } 
} 

alguna manera que sólo detecta Ctrl +Alt +K. Por favor, lea el comentario en el código de MessageFilter.

8

No estoy seguro si puedes. Sin embargo, lo que PUEDE hacer es la forma en que Visual Studio lo hace. Tiene accesos directos como Ctrl + K, C. En primer lugar, pulse Ctrl + K , a continuación, mantenga presionada la tecla Ctrl y pulse C. En su caso, se puede comprobar por Ctrl +Alt +K, P.

primer lugar, puede comprobar si hay solamente Ctrl + Alt + K como se hace en las otras respuestas, a continuación, establecer una variable miembro/bandera para indicar Ctrl + Alt + K ha sido presionado. En el mismo método donde verifique K, puede verificar P, y si el indicador que acaba de establecer se configuró en verdadero, haga lo que tenga que hacer. De lo contrario, establezca la bandera en falso.

áspero pseudo-código:

private bool m_bCtrlAltKPressed = false; 

public void KeyDown() { 
    if (Ctrl+Alt+K) 
    { 
    m_bCtrlAltKPressed = true; 
    } 
    else if (Ctrl+Alt+P && m_bCtrlAltKPressed) { 
    //do stuff 
    } 
    else { 
    m_bCtrlAltKPressed = false; 
    } 
} 

esperanza que es lo suficientemente clara.

11

Es un acorde, no puede detectarlo sin memorizar haber visto la primera pulsación de tecla del acorde. Esto funciona:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    private bool prefixSeen; 

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
     if (prefixSeen) { 
      if (keyData == (Keys.Alt | Keys.Control | Keys.P)) { 
       MessageBox.Show("Got it!"); 
      } 
      prefixSeen = false; 
      return true; 
     } 
     if (keyData == (Keys.Alt | Keys.Control | Keys.K)) { 
      prefixSeen = true; 
      return true; 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 
+0

¿No capturará esto las teclas repetitivas también? Si se usa un acorde como CTRL + P + P, por ejemplo? – rymdsmurf

+0

La repetición de las teclas produciría Ctrl + P Ctrl + P. Entonces no –

+0

Acabo de compilar y probé el código, y 'lo hace_ (incorrectamente) captura las teclas que se repiten si el acorde usa la misma tecla dos veces. Por ejemplo, mantener presionado CTRL + ALT + P activará el acorde CTRL + ALT + P + P. – rymdsmurf

1

Puede utilizar GetKeyState para obtener el estado de las otras teclas cuando una de las claves en la combinación se ha presionado. Aquí hay un ejemplo en un formulario.

using System.Linq; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace DetectKeyChord 
{ 
    public partial class Form1 : Form 
    { 
     private const int WM_KEYDOWN = 0x100; 
     private const int KEY_PRESSED = 0x80; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public void ShortcutAction() 
     { 
      MessageBox.Show("Ctrl+Alt+K+P has been pressed."); 
     } 

     private bool IsKeyDown(Keys key) 
     { 
      return (NativeMethods.GetKeyState(key) & KEY_PRESSED) == KEY_PRESSED; 
     } 

     protected override void WndProc(ref Message m) 
     { 
      if (m.Msg == WM_KEYDOWN) 
      { 
       //If any of the keys in the chord have been pressed, check to see if 
       //the entire chord is down. 
       if (new[] { Keys.P, Keys.K, Keys.ControlKey, Keys.Menu }.Contains((Keys)m.WParam)) 
       { 
        if (IsKeyDown(Keys.ControlKey) && IsKeyDown(Keys.Menu) && IsKeyDown(Keys.K) && IsKeyDown(Keys.P)) 
        { 
         this.ShortcutAction(); 
        } 
       } 
      } 
      base.WndProc(ref m); 
     } 
    } 

    public static class NativeMethods 
    { 
     [DllImport("USER32.dll")] 
     public static extern short GetKeyState(Keys nVirtKey); 
    } 
} 
Cuestiones relacionadas