protected override bool Callback(CallbackData data) { var e = GetEventArgs(data); if (e.IsMouseKeyDown) { ProcessDown(ref e); } if (e.IsMouseKeyUp) { ProcessUp(ref e); } if (e.WheelScrolled) { ProcessWheel(ref e); } if (HasMoved(e.Point)) { ProcessMove(ref e); } return !e.Handled; }
protected override bool Callback(CallbackData data) { var eDownUp = GetDownUpEventArgs(data); var pressEventArgs = GetPressEventArgs(data); InvokeKeyDown(eDownUp); foreach (var pressEventArg in pressEventArgs) { InvokeKeyPress(pressEventArg); } InvokeKeyUp(eDownUp); return !eDownUp.Handled; }
internal static IEnumerable<KeyPressEventArgsExt> FromRawDataApp(CallbackData data) { var wParam = data.WParam; var lParam = data.LParam; //http://msdn.microsoft.com/en-us/library/ms644984(v=VS.85).aspx const uint maskKeydown = 0x40000000; // for bit 30 const uint maskKeyup = 0x80000000; // for bit 31 const uint maskScanCode = 0xff0000; // for bit 23-16 var flags = (uint) lParam.ToInt64(); //bit 30 Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up. var wasKeyDown = (flags & maskKeydown) > 0; //bit 31 Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released. var isKeyReleased = (flags & maskKeyup) > 0; if (!wasKeyDown && !isKeyReleased) { yield break; } var virtualKeyCode = (int) wParam; var scanCode = checked((int) (flags & maskScanCode)); const int fuState = 0; char[] chars; KeyboardNativeMethods.TryGetCharFromKeyboardState(virtualKeyCode, scanCode, fuState, out chars); if (chars == null) yield break; foreach (var ch in chars) { yield return new KeyPressEventArgsExt(ch); } }
protected override IEnumerable<KeyPressEventArgsExt> GetPressEventArgs(CallbackData data) { return KeyPressEventArgsExt.FromRawDataGlobal(data); }
protected override KeyEventArgsExt GetDownUpEventArgs(CallbackData data) { return KeyEventArgsExt.FromRawDataGlobal(data); }
internal static IEnumerable<KeyPressEventArgsExt> FromRawDataGlobal(CallbackData data) { var wParam = data.WParam; var lParam = data.LParam; if ((int) wParam != Messages.WM_KEYDOWN) { yield break; } KeyboardHookStruct keyboardHookStruct = (KeyboardHookStruct) Marshal.PtrToStructure(lParam, typeof (KeyboardHookStruct)); var virtualKeyCode = keyboardHookStruct.VirtualKeyCode; var scanCode = keyboardHookStruct.ScanCode; var fuState = keyboardHookStruct.Flags; if (virtualKeyCode == KeyboardNativeMethods.VK_PACKET) { var ch = (char) scanCode; yield return new KeyPressEventArgsExt(ch, keyboardHookStruct.Time); } else { char[] chars; KeyboardNativeMethods.TryGetCharFromKeyboardState(virtualKeyCode, scanCode, fuState, out chars); if (chars == null) yield break; foreach (var current in chars) { yield return new KeyPressEventArgsExt(current, keyboardHookStruct.Time); } } }
protected abstract MouseEventExtArgs GetEventArgs(CallbackData data);
protected abstract IEnumerable<KeyPressEventArgsExt> GetPressEventArgs(CallbackData data);
protected abstract KeyEventArgsExt GetDownUpEventArgs(CallbackData data);
internal static MouseEventExtArgs FromRawDataGlobal(CallbackData data) { var wParam = data.WParam; var lParam = data.LParam; MouseStruct marshalledMouseStruct = (MouseStruct) Marshal.PtrToStructure(lParam, typeof (MouseStruct)); return FromRawDataUniversal(wParam, marshalledMouseStruct); }
private static IntPtr HookProcedure(int nCode, IntPtr wParam, IntPtr lParam, Callback callback) { var passThrough = nCode != 0; if (passThrough) { return CallNextHookEx(nCode, wParam, lParam); } var callbackData = new CallbackData(wParam, lParam); var continueProcessing = callback(callbackData); if (!continueProcessing) { return new IntPtr(-1); } return CallNextHookEx(nCode, wParam, lParam); }
protected abstract bool Callback(CallbackData data);
protected override MouseEventExtArgs GetEventArgs(CallbackData data) { return MouseEventExtArgs.FromRawDataApp(data); }