public static void HookKeyboard(Input.KeyboardCallback cb) { Input.sHookProc = (Input.HookProc)((code, wparam, lparam) => { if (code < 0 || wparam == 260U || wparam == 261U) { return(Input.CallNextHookEx(Input.sHookHandle, code, wparam, lparam)); } Input.HookData structure = (Input.HookData)Marshal.PtrToStructure(lparam, typeof(Input.HookData)); return(!cb(wparam == 256U, structure.vkCode) ? 1 : Input.CallNextHookEx(Input.sHookHandle, code, wparam, lparam)); }); if (Input.sHookHandle != 0) { throw new SystemException("Keyboard hook is already set"); } IntPtr moduleHandle = Input.GetModuleHandle(IntPtr.Zero); Input.sHookHandle = Input.SetWindowsHookEx(13, Input.sHookProc, moduleHandle, 0U); if (Input.sHookHandle == 0) { throw new SystemException("Cannot set hooks", (Exception) new Win32Exception(Marshal.GetLastWin32Error())); } }
private static extern int SetWindowsHookEx( int type, Input.HookProc callback, IntPtr module, uint threadId);