using System.Runtime.InteropServices;
調用操做系統動態連接庫的方法函數
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr SetWindowsHookExW(int idHook, HookHandlerDelegate lpfn, IntPtr hmod, uint dwThreadID);
第一個參數表明鉤子ID(13表明鍵盤鉤子,14表明鼠標鉤子),第二個參數是一個函數指針,指向鉤子須要執行的函數,第三個參數是指向進程塊的指針,第四個參數默認爲0就好了。ui
再引用一個獲取進程塊指針的方法spa
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr GetModuleHandle(String modulename);
public const int WM_KEYDOWN = 0x0100; public const int WH_KEYBOARD_LL = 13; public const int WM_SYSKEYDOWN = 0x0104;
定義儲存按鍵信息的結構體:操作系統
public struct KBDLLHOOKSTRUCT { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; }
定義一個函數指針:指針
public delegate int HookHandlerDelegate(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam);
聲明一個指向執行函數的函數指針:code
private HookHandlerDelegate proc;
構造鉤子:blog
public void disableKeys() { proc = new HookHandlerDelegate(HookCallback); using (Process curPro = Process.GetCurrentProcess()) using (ProcessModule curMod = curPro.MainModule) { SetWindowsHookExW(WH_KEYBOARD_LL, proc, GetModuleHandle(curMod.ModuleName), 0); } }
HookCallback即爲鉤子執行的函數進程
private int HookCallback(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam) { if (nCode >= 0 && (wparam == (IntPtr)WM_KEYDOWN || wparam == (IntPtr)WM_SYSKEYDOWN)) { if (lparam.vkCode == 91 || lparam.vkCode == 164 || lparam.vkCode == 9 || lparam.vkCode == 115) { return 1; } else { return 0; } } return 0; }
這裏返回1表明消息終止,即不響應,返回0表示繼續。這裏的91,164,9,115即鍵盤的acsii值,表示屏蔽這些按鍵。it