Keyboard hook stops working after using Remote desktop

自古美人都是妖i 提交于 2020-02-21 06:07:33

问题


I've the following problem:

My global keyboard hook stops working after i start any Remote Desktop session, even if session is closed hook doesn't work at all.

Here is code of my hook

public class KeyboardHooker : IDisposable
    {
        private IntPtr _hhook;
        private static User32.LowLevelKeyboardProc _delegate;

        public KeyboardHooker()
        {
            _delegate = new User32.LowLevelKeyboardProc(HookCallback);
        }

        public void SetHook()
        {
            if (IsHookSetted)
                return;

            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                _hhook = User32.SetWindowsHookEx(User32.WH_KEYBOARD_LL, _delegate, Kernel32.GetModuleHandle(curModule.ModuleName), 0);
            }
        }

        public void ReleaseHook()
        {
            if (IsHookSetted)
            {
                User32.UnhookWindowsHookEx(_hhook);
                _hhook = IntPtr.Zero;
            }
        }

        public bool IsHookSetted
        {
            get { return _hhook != IntPtr.Zero; }
        }

        private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                bool handled = false;

                switch (wParam.ToInt32())
                {
                    case Messages.WM_SYSKEYDOWN:
                    case Messages.WM_KEYDOWN:
                        int vkCode = Marshal.ReadInt32(lParam);
                        Keys keys = ExtractKey(vkCode);
                        RaiseKeyDown(keys, ref handled);
                        break;
                    case Messages.WM_SYSKEYUP:
                    case Messages.WM_KEYUP:
                        vkCode = Marshal.ReadInt32(lParam);
                        keys = ExtractKey(vkCode);
                        RaiseKeyUp(keys, ref handled);
                        break;
                }
                if (handled)
                    return IntPtr.Add(IntPtr.Zero, 1);
            }
            GC.KeepAlive(this);
            return User32.CallNextHookEx(_hhook, nCode, wParam, lParam);
        }

        private Keys ExtractKey(int wParam)
        {
            Keys key = (Keys)wParam;
            return key;
        }
        #region Events

        public event KeyEventHandler KeyDown;
        public event KeyEventHandler KeyUp;

        private void RaiseKeyUp(Keys keys, ref bool handled)
        {
            if (KeyUp != null)
            {
                KeyEventArgs e = new KeyEventArgs(keys);
                KeyUp(this, e);
                handled = e.Handled;
            }
        }


        private void RaiseKeyDown(Keys keys, ref bool handled)
        {
            if (KeyDown != null)
            {
                KeyEventArgs e = new KeyEventArgs(keys);
                KeyDown(this, e);
                handled = e.Handled;
            }
        }
        #endregion

        #region Implementation of IDisposable

        /// <summary>
        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        /// </summary>
        /// <filterpriority>2</filterpriority>
        public void Dispose()
        {
            ReleaseHook();
        }

        #endregion
    }

Does anybody know how to solve this problem?


回答1:


I've found a solution. It happens when my code process keys input for a long time and Windows detached my hook by timeout. Now I process each operation in separate thread and hook works fine.



来源:https://stackoverflow.com/questions/5065832/keyboard-hook-stops-working-after-using-remote-desktop

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!