2009-02-20 16 views

Respuesta

1

No estoy seguro si esto está disponible en C# pero puede llamar al GetAsyncKeyState. Este método devuelve el estado de una clave en el momento en que se llama al método.

Para invocarlo desde C# necesitarás usar la interoperabilidad como cualquier otra API de Win32.

8

Form.ModifierKeys (propiedad estática)

+4

Esto funciona, pero la propiedad se hereda de Control not Form –

2

puede instalar un low-level keyboard hook.

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

class InterceptKeys 
{ 
    private const int WH_KEYBOARD_LL = 13; 
    private const int WM_KEYDOWN = 0x0100; 
    private static LowLevelKeyboardProc _proc = HookCallback; 
    private static IntPtr _hookID = IntPtr.Zero; 

    public static void Main() 
    { 
     _hookID = SetHook(_proc); 
     Application.Run(); 
     UnhookWindowsHookEx(_hookID); 
    } 

    private static IntPtr SetHook(LowLevelKeyboardProc proc) 
    { 
     using (Process curProcess = Process.GetCurrentProcess()) 
     using (ProcessModule curModule = curProcess.MainModule) 
     { 
      return SetWindowsHookEx(WH_KEYBOARD_LL, proc, 
       GetModuleHandle(curModule.ModuleName), 0); 
     } 
    } 

    private delegate IntPtr LowLevelKeyboardProc(
     int nCode, IntPtr wParam, IntPtr lParam); 

    private static IntPtr HookCallback(
     int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
     { 
      int vkCode = Marshal.ReadInt32(lParam); 
      Console.WriteLine((Keys)vkCode); 
     } 
     return CallNextHookEx(_hookID, nCode, wParam, lParam); 
    } 

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

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

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

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string lpModuleName); 
} 
19
if ((Control.ModifierKeys & Keys.Shift) != 0) 

Esto también será true si otra tecla de modificación también es hacia abajo (por ejemplo, Shift Ctrl +). Si desea comprobar si Shift solo se presiona sin otros modificadores, utilice

if (Control.ModifierKeys == Keys.Shift) 

Tenga en cuenta que incluso esto será true si otro no modificadora está abajo (Por ejemplo, Shift + A). Si desea verificar si Shift y solo se presionan Shift, tendrá que usar una llamada API.


Si estás en una clase que hereda Control (como un formulario), puede quitar el calificativo Control. (static propiedades no necesitan calificadores en clases heredadas)

Cuestiones relacionadas