private IntPtr LowLevelKeyboardHookProc( int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { KeyHookedStruct keyStruct = (KeyHookedStruct)Marshal.PtrToStructure(lParam, typeof(KeyHookedStruct)); KeyMessage keyboardMessage = (KeyMessage)wParam; KeyStates state; switch (keyboardMessage) { case KeyMessage.WM_KEYDOWM: case KeyMessage.WM_SYSKEYDOWN: state = KeyStates.KeyDown; break; case KeyMessage.WM_KEYUP: case KeyMessage.WM_SYSKEYUP: state = KeyStates.KeyUp; break; case KeyMessage.WM_CHAR: case KeyMessage.WM_DEADCHAR: case KeyMessage.WM_SYSCHAR: default: state = KeyStates.KeyQuest; break; } KeyboardData keyData = new KeyboardData(keyStruct.VirtualKeyCode, state); return OnHooked(keyData) ? CallNextHookEx(mKeyboardHook, nCode, wParam, lParam) : new IntPtr(1); } else return CallNextHookEx(mKeyboardHook, nCode, wParam, lParam); }
private INPUT BuildKeyInput(KeyboardData keyData) { INPUT input = new INPUT(); input.mType = SENDINPUTEVENTTYPE.INPUT_KEYBOARD; input.mInputUnion.ki = new KEYBDINPUT { wVk = (short)keyData.Key.Code, dwFlags = (KeyState)keyData.State == KeyState.KeyUp ? KEYEVENTF.KEYUP : KEYEVENTF.NONE, }; return input; }