键盘"全局钩子"的使用 ..
来源:互联网 发布:linux命令文件大小变化 编辑:程序博客网 时间:2024/05/16 10:58
-
-
- public class KeyboardHook {
-
- public event KeyEventHandler KeyDownEvent;
- public event KeyPressEventHandler KeyPressEvent;
- public event KeyEventHandler KeyUpEvent;
- public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
- static int hKeyboardHook = 0;
-
- public const int WH_KEYBOARD_LL = 13;
- HookProc KeyboardHookProcedure;
-
-
- [StructLayout(LayoutKind.Sequential)]
- public class KeyboardHookStruct
- {
- public int vkCode;
- public int scanCode;
- public int flags;
- public int time;
- public int dwExtraInfo;
- }
-
- [DllImport("user32.dll",CharSet=CharSet.Auto,
- CallingConvention=CallingConvention.StdCall)]
- public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
- IntPtr hInstance, int threadId);
-
- [DllImport("user32.dll",CharSet=CharSet.Auto,
- CallingConvention=CallingConvention.StdCall)]
- public static extern bool UnhookWindowsHookEx(int idHook);
-
- [DllImport("user32.dll",CharSet=CharSet.Auto,
- CallingConvention=CallingConvention.StdCall)]
- public static extern int CallNextHookEx(int idHook, int nCode,
- Int32 wParam, IntPtr lParam);
-
-
- [DllImport("kernel32.dll")]
- static extern int GetCurrentThreadId();
- public void Start()
- {
-
- if(hKeyboardHook == 0)
- {
- KeyboardHookProcedure = new HookProc(KeyboardHookProc);
- hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if(hKeyboardHook == 0 ) {
- Stop();
- throw new Exception("安装键盘钩子失败");
- }
- }
- }
- public void Stop()
- {
- bool retKeyboard = true;
-
-
- if(hKeyboardHook != 0)
- {
- retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
- hKeyboardHook = 0;
- }
-
- if (!(retKeyboard)) throw new Exception("卸载钩子失败!");
- }
-
- [DllImport("user32")]
- public static extern int ToAscii(int uVirtKey,
- int uScanCode,
- byte[] lpbKeyState,
- byte[] lpwTransKey,
- int fuState);
-
- [DllImport("user32")]
- public static extern int GetKeyboardState(byte[] pbKeyState);
- private const int WM_KEYDOWN = 0x100;
- private const int WM_KEYUP = 0x101;
- private const int WM_SYSKEYDOWN = 0x104;
- private const int WM_SYSKEYUP = 0x105;
- private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
- {
-
- if ((nCode >= 0) && (KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null))
- {
- KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct) Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
-
- if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
- {
- Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
- KeyEventArgs e = new KeyEventArgs(keyData);
- KeyDownEvent(this, e);
- }
-
- if (KeyPressEvent != null && wParam == WM_KEYDOWN)
- {
- byte[] keyState = new byte[256];
- GetKeyboardState(keyState);
- byte[] inBuffer= new byte[2];
- if (ToAscii(MyKeyboardHookStruct.vkCode,
- MyKeyboardHookStruct.scanCode,
- keyState,
- inBuffer,
- MyKeyboardHookStruct.flags)==1)
- {
- KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
- KeyPressEvent(this, e);
- }
- }
-
- if (KeyUpEvent != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
- {
- Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
- KeyEventArgs e = new KeyEventArgs(keyData);
- KeyUpEvent(this, e);
- }
- }
-
-
- return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
- }
- ~KeyboardHook()
- {
- Stop();
- }
- }
- private KeyboardHook k_hook;
- private void HookForm_Load(object sender, EventArgs e)
- {
- try
- {
- if (this.buttonKeyHook.Text == "安装键盘钩子")
- {
- k_hook = new KeyboardHook();
- k_hook.KeyDownEvent += new KeyEventHandler(hook_KeyDown);
- k_hook.Start();
- this.buttonKeyHook.Text = "卸载键盘钩子";
- }else if(k_hook!=null)
- {
- k_hook.Stop();
- this.buttonKeyHook.Text = "安装键盘钩子";
- }
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- private void hook_KeyDown(object sender, KeyEventArgs e)
- {
-
- }