2009-02-20 9 views

Répondre

1

Vous ne savez pas si cela est disponible en C#, mais vous pouvez appeler GetAsyncKeyState. Cette méthode renvoie l'état d'une clé au moment de l'appel de la méthode.

Pour l'appeler à partir de C#, vous devez utiliser interop comme toute autre API Win32.

8

Form.ModifierKeys (propriété statique)

+4

Cela fonctionne, mais la propriété est héritée de Contrôle pas Form –

2

Vous pouvez installer 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) 

Ce sera également true si une autre touche de modification est également en baisse (par exemple, Ctrl + Maj). Si vous voulez vérifier si seul Shift est appuyée sans autres modificateurs, utilisez

if (Control.ModifierKeys == Keys.Shift) 

Notez que même ce sera true si un autre non-modificateur est vers le bas (par exemple, Maj + A). Si vous voulez vérifier si Shift et seulement Shift est pressé, vous devrez utiliser un appel d'API.


Si vous êtes dans une classe qui hérite Control (comme une forme), vous pouvez supprimer le qualificatif Control. (static propriétés n'ont pas besoin de qualificateurs dans les classes héritées)

Questions connexes