2011-01-16 17 views
7

me encontré con este pequeño trozo de código para registrar una tecla de acceso directo:Registre más de una tecla de acceso directo con RegisterHotKey

[DllImport("user32.dll")] 
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0312) 
      MessageBox.Show("Hotkey pressed"); 
     base.WndProc(ref m); 
    } 

    public FormMain() 
    { 
     InitializeComponent(); 
     //Alt + A 
     RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 1, (int)'A'); 
    } 

Funciona perfectamente, pero mi problema es que quiero utilizar dos accesos directos diferentes. Sé que el segundo parámetro es la identificación, así que me imagino que podría hacer una identificación diferente y agregar una nueva declaración if en la función WndProc, pero no estoy seguro de cómo hacerlo.

En resumen, ¿cómo podría crear un segundo atajo?

Gracias,

+2

'GetHashCode()' como ID se rompe de dos maneras. 1) Dos tipos pueden tener el mismo hash 2) Utiliza el rango incorrecto. "Una aplicación debe especificar un valor de id en el rango de 0x0000 a 0xBFFF. Una DLL compartida debe especificar un valor en el rango de 0xC000 a 0xFFFF (el rango devuelto por la función GlobalAddAtom). Para evitar conflictos con los identificadores de teclas definidas por otros compartidos DLL, una DLL debería usar la función GlobalAddAtom para obtener el identificador de la tecla de acceso rápido ". – CodesInChaos

Respuesta

15
RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 1, (int)'A') 

no utilice GetHashCode() aquí. Simplemente numere sus teclas de acceso rápido, comience en 0. No hay ningún peligro de confundir los identificadores, los identificadores de teclas de acceso rápido son específicos para cada Manecilla. Obtendrá el id en el método WndProc(). Use m.WParam.ToInt32() para obtener el valor:

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0x0312) { // Trap WM_HOTKEY 
     int id = m.WParam.ToInt32(); 
     MessageBox.Show(string.Format("Hotkey #{0} pressed", id)); 
    } 
    base.WndProc(ref m); 
} 
+0

Falta el corchete de cierre en la línea "Mbox.Show" - no se puede editar, ya que necesito 6 caracteres editados ~. ~ – torno

Cuestiones relacionadas