コード例 #1
0
        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));
        }
コード例 #2
0
            public DeadKeyInfo(KeyboardLowLevelHookInfo info, byte[] keyState)
            {
                KeyCode  = info.KeyCode;
                ScanCode = info.ScanCode;

                KeyboardState = keyState;
            }
コード例 #3
0
        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);
        }