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)); } }
internal static IEnumerable <KeyPressEventArgsExt> FromRawDataGlobal(CallbackData data) { var wParam = data.WParam; var lParam = data.LParam; if ((int)wParam != Messages.WM_KEYDOWN && (int)wParam != Messages.WM_SYSKEYDOWN) { 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 override KeyEventArgsExt GetDownUpEventArgs(CallbackData data) { return(KeyEventArgsExt.FromRawDataGlobal(data)); }
protected override IEnumerable <KeyPressEventArgsExt> GetPressEventArgs(CallbackData data) { return(KeyPressEventArgsExt.FromRawDataGlobal(data)); }
protected override MouseEventExtArgs GetEventArgs(CallbackData data) { return(MouseEventExtArgs.FromRawDataGlobal(data)); }