Exemplo n.º 1
0
 private static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, ref KbdllHookStruct lParam);
Exemplo n.º 2
0
        //The listener that will trigger events
        private int KeybHookProc(int Code, int W, int L)
        {
            var LS = new KbdllHookStruct();

            if (Code < 0)
            {
                return(CallNextHookEx(_hookId, Code, W, L));
            }
            try
            {
                if (!_global)
                {
                    if (Code == 3)
                    {
                        var keydownup = L >> 30;
                        switch (keydownup)
                        {
                        case 0:
                            KeyDown?.Invoke((Keys)W, GetShiftPressed(), GetCtrlPressed(), GetAltPressed());
                            break;

                        case -1:
                            KeyUp?.Invoke((Keys)W, GetShiftPressed(), GetCtrlPressed(), GetAltPressed());
                            break;
                        }

                        //System.Diagnostics.Debug.WriteLine("Down: " + (Keys)W);
                    }
                }
                else
                {
                    var kEvent = (KeyEvents)W;

                    var vkCode = Marshal.ReadInt32((IntPtr)L);  //Leser vkCode som er de første 32 bits hvor L peker.

                    if (kEvent != KeyEvents.KeyDown &&
                        kEvent != KeyEvents.KeyUp &&
                        kEvent != KeyEvents.SKeyDown &&
                        kEvent != KeyEvents.SKeyUp)
                    {
                    }

                    switch (kEvent)
                    {
                    case KeyEvents.KeyDown:
                    case KeyEvents.SKeyDown:
                        KeyDown?.Invoke((Keys)vkCode, GetShiftPressed(), GetCtrlPressed(), GetAltPressed());
                        break;

                    case KeyEvents.KeyUp:
                    case KeyEvents.SKeyUp:
                        KeyUp?.Invoke((Keys)vkCode, GetShiftPressed(), GetCtrlPressed(), GetAltPressed());
                        break;
                    }
                }
            }
            catch (Exception)
            {
                //Ignore all errors...
            }

            return(CallNextHookEx(_hookId, Code, W, L));
        }
Exemplo n.º 3
0
        /// <summary>
        /// The method that will be called whenever a key is pressed
        /// </summary>
        /// <param name="code">A code the hook procedure uses to determine how to process the message</param>
        /// <param name="w">The identifier of the keyboard message</param>
        /// <param name="l">A pointer to a KbdllHookStruct structure</param>
        /// <returns>This value is returned by the next hook procedure in the chain</returns>
        private IntPtr KeybHookProc(int code, IntPtr w, ref KbdllHookStruct l)
        {
            if (code < 0)
            {
                return(CallNextHookEx(_hookId, code, w, ref l));
            }

            KeyEvents kEvent = (KeyEvents)w;

            Key dataKey = KeyInterop.KeyFromVirtualKey((int)l.vkCode);

            bool isDownShift    = (GetKeyState(VkShift) & 0x80) == 0x80;
            bool isDownCapslock = GetKeyState(VkCapital) != 0;

            byte[] keyState = new byte[256];
            GetKeyboardState(keyState);

            StringBuilder sbString = new StringBuilder(10);
            IntPtr        hkLayout = GetKeyboardLayout((uint)Process.GetCurrentProcess().Handle.ToInt32());
            int           res      = ToUnicodeEx(l.vkCode, l.scanCode, keyState, sbString, sbString.Capacity, l.flags, hkLayout);

            // Key can be translated to unicode counterpart
            if (res == 1)
            {
                char key = sbString[0];

                if ((isDownCapslock || isDownShift) && char.IsLetter(key))
                {
                    key = char.ToUpper(key);
                }

                string result = key.ToString();

                if (char.IsControl(key) && _logControlKeys)
                {
                    if (dataKey == Key.Enter && _enterKeyNewLine)
                    {
                        result = Environment.NewLine;
                    }
                    else
                    {
                        result = "[" + dataKey + "]";
                    }
                }

                switch (kEvent)
                {
                case KeyEvents.KeyDown:
                case KeyEvents.SKeyDown:
                    KeyDown?.Invoke(result);
                    break;

                case KeyEvents.KeyUp:
                case KeyEvents.SKeyUp:
                    KeyUp?.Invoke(result);
                    break;
                }
            }
            // Key cannot be translated to unicode counterpart
            else if (res == 0)
            {
                if (!_logSpecialKeys)
                {
                    return(CallNextHookEx(_hookId, code, w, ref l));
                }
                // ReSharper disable once SwitchStatementMissingSomeCases
                switch (kEvent)
                {
                case KeyEvents.KeyDown:
                case KeyEvents.SKeyDown:
                    KeyDown?.Invoke("[" + dataKey + "]");
                    break;

                case KeyEvents.KeyUp:
                case KeyEvents.SKeyUp:
                    KeyUp?.Invoke("[" + dataKey + "]");
                    break;
                }
            }
            return(CallNextHookEx(_hookId, code, w, ref l));
        }