2009-02-20 60 views

Trả lời

1

Không chắc chắn nếu điều này có sẵn trong C# nhưng bạn có thể gọi GetAsyncKeyState. Phương thức này trả về trạng thái của một khóa tại thời điểm mà phương thức được gọi.

Để gọi từ C#, bạn cần sử dụng interop giống như bất kỳ API Win32 nào khác.

8

Form.ModifierKeys (thuộc tính tĩnh)

+4

Tác phẩm này hoạt động nhưng thuộc tính được kế thừa từ Kiểm soát không phải biểu mẫu –

2

Bạn có thể cài đặt một 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) 

Đây cũng sẽ là true nếu một phím modifier cũng là xuống (ví dụ: Ctrl + Shift). Nếu bạn muốn kiểm tra xem phím Shift một mình được nhấn mà không cần bất kỳ bổ khác, sử dụng

if (Control.ModifierKeys == Keys.Shift) 

Lưu ý rằng ngay cả điều này sẽ true nếu một phi modifier là xuống (Ví dụ, Shift + A). Nếu bạn muốn kiểm tra xem Shift và chỉ có Shift được nhấn, bạn sẽ phải sử dụng cuộc gọi API.


Nếu bạn đang ở trong một lớp kế thừa Control (chẳng hạn như một hình thức), bạn có thể loại bỏ các Control vòng loại. (static thuộc tính không cần bộ định tính trong các lớp kế thừa)

Các vấn đề liên quan