2010-07-29 10 views

Respuesta

3
/// <summary> 
    /// Security routines related to the Windows Key on a standard personal computer Keyboard 
    /// </summary> 
    public static class WindowsKey { 
     /// <summary> 
     /// Disables the Windows Key 
     /// </summary> 
     /// <remarks>May require the current user to logoff or restart the system</remarks> 
     public static void Disable() { 
      RegistryKey key = null; 
      try { 
       key = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Control\\Keyboard Layout", true); 
       byte[] binary = new byte[] { 
        0x00, 
        0x00, 
        0x00, 
        0x00, 
        0x00, 
        0x00, 
        0x00, 
        0x00, 
        0x03, 
        0x00, 
        0x00, 
        0x00, 
        0x00, 
        0x00, 
        0x5B, 
        0xE0, 
        0x00, 
        0x00, 
        0x5C, 
        0xE0, 
        0x00, 
        0x00, 
        0x00, 
        0x00 
       }; 
       key.SetValue("Scancode Map", binary, RegistryValueKind.Binary); 
      } 
      catch (System.Exception ex) { 
       Debug.Assert(false, ex.ToString()); 
      } 
      finally { 
       key.Close(); 
      } 
     } 

     /// <summary> 
     /// Enables the Windows Key 
     /// </summary> 
     /// <remarks>May require the current user to logoff or restart the system</remarks> 
     public static void Enable() { 
      RegistryKey key = null; 
      try { 
       key = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Control\\Keyboard Layout", true); 
       key.DeleteValue("Scancode Map", true); 
      } 
      catch (System.Exception ex) { 
       Debug.Assert(false, ex.ToString()); 
      } 
      finally { 
       key.Close(); 
      } 
     } 
    } 
+0

muy buena respuesta –

4

Necesita un gancho de teclado. Inicia un sitio como este:

hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, 0); 

y continuar de esta manera:

LRESULT KeyboardProc(...) 
    { 
    if (Key == VK_SOMEKEY) 
    return 1;    // Trap key 


    return CallNextHookEx(...); // Let the OS handle it 

    } 

Y para más detalles: http://www.codeproject.com/KB/winsdk/AntonioWinLock.aspx

1

Suponiendo que desea desactivar la tecla Windows permenantly y no sólo cuando su código está en foco, entonces puede hacerlo editando el registro de la siguiente manera:

Para deshabilitar : Añadir un nuevo valor REG_BINARY denominado "Scancode Mapa" a "HKEY_LOCAL_ MACHINE \ System \ CurrentControlSet \ Control \ Keyboard Layout" con un valor de datos de "00000000000000000300000000005BE000005CE000000000"

Para habilitar : Elimine completamente el valor "Scancode Map" del registro.

+0

+1, gracias por eso. Sin embargo, no estaría feliz con el tipo que destrozó mi teclado. – Tobiasopdenbrouw

3

Usar los ganchos de Windows es mucho más limpio que modificar el registro. Además, a veces las personas han configurado sus propios mapas de escaneo personalizados, y sobrescribirlos no es algo muy amable de hacer.

Para utilizar las ventanas de las funciones clave de gancho que necesita para dllimport funciona un par WinAPI:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern IntPtr GetModuleHandle(string lpModuleName); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate lpfn, IntPtr hMod, uint dwThreadId); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool UnhookWindowsHookEx(IntPtr hhk); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam); 

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] 
public static extern short GetKeyState(int keyCode); 

Una explicación bastante completa y paso a paso se pueden encontrar en CodeProject. Aquí hay un direct link a un archivo de clase autónomo de ese ejemplo que hace de todo (para que compile limpio si está usando WPF necesitará que haga referencia manualmente a System.Windows.Forms dll o simplemente cambie el 'System.Windows.Forms La referencia de. Keys a System.Windows.Input.Key debería funcionar).

Recuerde llamar a UnhookWindowsHookEx() (la clase hace esto en Dispose()) para desenganchar sus capturas o la gente lo odiará.

Cuestiones relacionadas