using System; using System.Runtime.InteropServices; using System.Windows.Forms; public class KeyboardHook : IDisposable { private const int WM_KEYDOWN = 0x0100; private const int WM_KEYUP = 0x0101; private const int WM_SYSKEYDOWN = 0x0104; private const int WM_SYSKEYUP = 0x0105; private IntPtr _hookId = IntPtr.Zero; public event KeyEventHandler KeyDown; public event KeyEventHandler KeyUp; public KeyboardHook() { _hookId = SetHook(HookCallback); } private IntPtr SetHook(LowLevelKeyboardProc proc) { using (var curProcess = Process.GetCurrentProcess()) using (var curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { var key = (Keys)Marshal.ReadInt32(lParam); if (key == Keys.LWin || key == Keys.RWin) { return (IntPtr)1; } var eventArgs = new KeyEventArgs(key); if ((wParam.ToInt32() == WM_KEYDOWN || wParam.ToInt32() == WM_SYSKEYDOWN) && KeyDown != null) { KeyDown(this, eventArgs); } else if ((wParam.ToInt32() == WM_KEYUP || wParam.ToInt32() == WM_SYSKEYUP) && KeyUp != null) { KeyUp(this, eventArgs); } if (eventArgs.Handled) { return (IntPtr)1; } } return CallNextHookEx(_hookId, nCode, wParam, lParam); } public void Dispose() { if (_hookId != IntPtr.Zero) { UnhookWindowsHookEx(_hookId); _hookId = IntPtr.Zero; } } [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); private const int WH_KEYBOARD_LL = 13; }
public static void Main() { using (var keyboardHook = new KeyboardHook()) { keyboardHook.KeyDown += (sender, args) => { if (args.KeyCode == Keys.LWin || args.KeyCode == Keys.RWin) { args.Handled = true; } }; Application.Run(); } }
标签:wParam,IntPtr,c#,禁用,WM,CharSet,private,Windows,int From: https://www.cnblogs.com/ZhyjEye/p/18061807