private static string ToUnicode(KBDLLHOOKSTRUCT info) { string result = null; var keyState = new byte[256]; var buffer = new StringBuilder(128); var success = NativeMethods.GetKeyboardState(keyState); if (!success) { return(string.Empty); } var isAltGr = IsKeyPressed(NativeMethods.VK_RMENU) && IsKeyPressed(NativeMethods.VK_LCONTROL); if (isAltGr) { keyState[NativeMethods.VK_LCONTROL] = keyState[NativeMethods.VK_LALT] = 0x80; } var layout = GetForegroundKeyboardLayout(); var count = ToUnicode((Keys)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); }
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); }
private static string ToUnicode(KBDLLHOOKSTRUCT info) { string result = null; var keyState = new byte[256]; var buffer = new StringBuilder(128); var success = NativeMethods.GetKeyboardState(keyState); if(!success) return string.Empty; var isAltGr = IsKeyPressed(NativeMethods.VK_RMENU) && IsKeyPressed(NativeMethods.VK_LCONTROL); if (isAltGr) keyState[NativeMethods.VK_LCONTROL] = keyState[NativeMethods.VK_LALT] = 0x80; var layout = GetForegroundKeyboardLayout(); var count = ToUnicode((Keys) 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; }