private IntPtr HookProc(Int32 nCode, IntPtr wParam, KeyboardLowLevelHookInfo info) { if (nCode == 0) { var args = new KeyEventArgs(info.KeyData); var handler = SendKeyDown; if (info.IsKeyUp) { handler = SendKeyUp; } SynchronizationContext.Current.Send(handler, args); if (info.IsKeyDown && !args.SuppressKeyPress && Events[KeyPressEvent] != null) { string str = ToUnicode(info); if (!string.IsNullOrEmpty(str)) { foreach (char ch in str) { SynchronizationContext.Current.Send(SendKeyPress, new KeyPressEventArgs(ch)); } } } if (args.Handled) { return(new IntPtr(-1)); } } return(NativeMethods.CallNextHookEx(IntPtr.Zero, nCode, wParam, info)); }
public DeadKeyInfo(KeyboardLowLevelHookInfo info, byte[] keyState) { KeyCode = info.KeyCode; ScanCode = info.ScanCode; KeyboardState = keyState; }
private static string ToUnicode(KeyboardLowLevelHookInfo info) { string result = null; var keyState = new byte[256]; var buffer = new StringBuilder(128); if (!NativeMethods.GetKeyboardState(keyState)) { throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); } var layout = GetForegroundKeyboardLayout(); var count = ToUnicode(info.KeyCode, info.ScanCode, keyState, buffer, layout); if (count > 0) { result = buffer.ToString(0, count); if (_lastDeadKey != null) { ToUnicode(_lastDeadKey.KeyCode, _lastDeadKey.ScanCode, _lastDeadKey.KeyboardState, buffer, layout); _lastDeadKey = null; } } else if (count < 0) { _lastDeadKey = new DeadKeyInfo(info, keyState); while (count < 0) { count = ToUnicode(Keys.Decimal, buffer, layout); } } return(result); }