using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Key { class Hook { public delegate int HookKeyProc(int code, IntPtr wParam, IntPtr lParam); private HookKeyProc hookKeyDeleg; private static int hHookKey = 0; public Hook() { } public methods#region public methods //安装钩子 public void Start() { if (hHookKey != 0) { //Unhook the previouse one this.Stop(); } hookKeyDeleg = new HookKeyProc(HookKeyProcedure); hHookKey = SetWindowsHookEx(WH_KEYBOARD_LL, hookKeyDeleg, GetModuleHandle(null), 0); if (hHookKey == 0) { throw new SystemException("Failed acquiring of the hook."); } } //拆除钩子 public void Stop() { UnhookWindowsHookEx(hHookKey); } #endregion protected and private methods#region protected and private methods private int HookKeyProcedure(int code, IntPtr wParam, IntPtr lParam) { KBDLLHOOKSTRUCT hookStruct = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); if (code < 0) { return CallNextHookEx(hookKeyDeleg, code, wParam, lParam); } if (hookStruct.vkCode == 0x72)//拨打电话键 { //自己的处理 //处理完之后一定要返回-1 return -1 } // 没处理的键的消息往下传递 return CallNextHookEx(hookKeyDeleg, code, wParam, lParam); } #endregion P/Invoke declarations#region P/Invoke declarations [DllImport("coredll.dll")] private static extern int SetWindowsHookEx(int type, HookKeyProc HookKeyProc, IntPtr hInstance, int m); [DllImport("coredll.dll")] private static extern IntPtr GetModuleHandle(string mod); [DllImport("coredll.dll")] private static extern int CallNextHookEx(HookKeyProc hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("coredll.dll")] private static extern int GetCurrentThreadId(); [DllImport("coredll.dll", SetLastError = true)] private static extern int UnhookWindowsHookEx(int idHook); private struct KBDLLHOOKSTRUCT { public int vkCode; public int scanCode; public int flags; public int time; public IntPtr dwExtraInfo; } const int WH_KEYBOARD_LL = 20; public class KeyBoardInfo { public int vkCode; public int scanCode; public int flags; public int time; } #endregion } }
在应用时,可以将这个类添加到自己的项目中,在要用的地方直接调用,方法如下:
Hook hk=new Hook();
hk.Start();
hk.Stop();