none
软件通过代码注册了快捷键后。就拦截了整个系统。其他软件怎样继续使用呢。 RRS feed

  • 问题

  • 代码在github上

    快捷键被拦截

    https://github.com/pengxiaobo123/kuaijiejian

    软件通过代码注册了快捷键后。就拦截了整个系统。其他软件怎样继续使用呢。 

    怎样才能让其他软件继续获取到被我自己写的软件拦截的快捷键呢?

    2020年7月13日 15:23

全部回复

  • Hi 彭123,

    根据我的测试,我发现我不能理解这个注册快捷键的原理,你可以详细解释下吗?

    我测试的是点击按钮,跳出一些文本在控件上面,

    另外,你可以说下拦截系统的具体意思吗,或者有相关的截图吗?

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年7月15日 1:37
    版主
  • Hi 彭123,

    根据我的测试,我发现我不能理解这个注册快捷键的原理,你可以详细解释下吗?

    我测试的是点击按钮,跳出一些文本在控件上面,

    另外,你可以说下拦截系统的具体意思吗,或者有相关的截图吗?

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    他这个注册快捷键的原理就是利用钩子,来拦截系统消息,例如当我注册了键盘按钮Q和P以后,当我点击Q和P时,哪怕焦点在其他软件,例如wrod,qq上面,Q键这个命令也会被我的软件拦截到。

    wpfHwnd = new WindowInteropHelper(this).Handle;
    
                var hWndSource = HwndSource.FromHwnd(wpfHwnd);
                //添加处理程序
                if (hWndSource != null) hWndSource.AddHook(MainWindowProc);//添加钩子
                hotKeyDic.Add("Q", Win32.GlobalAddAtom("Q"));
                hotKeyDic.Add("P", Win32.GlobalAddAtom("P"));


    注册按钮拦截

    /// <summary>
            /// 注册热键
            /// </summary>
            /// <param name="obj"></param>
            private void RegisterHotKey()
            {
                Win32.RegisterHotKey(wpfHwnd, hotKeyDic["Q"], Win32.KeyModifiers.None, (int)System.Windows.Forms.Keys.Q);
                Win32.RegisterHotKey(wpfHwnd, hotKeyDic["P"], Win32.KeyModifiers.None, (int)System.Windows.Forms.Keys.P);
            }


    现在我想要做到的就是,哪怕是被我拦截了,其他软件也能够获取到Q键或者P键输入的东西

    按钮被拦截

    /// <summary>
            /// 响应快捷键事件
            /// </summary>
            /// <param name="hwnd"></param>
            /// <param name="msg"></param>
            /// <param name="wParam"></param>
            /// <param name="lParam"></param>
            /// <param name="handled"></param>
            /// <returns></returns>
            private IntPtr MainWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                switch (msg)
                {
                    case Win32.WmHotkey:
                        {
                            int sid = wParam.ToInt32();
                            if (sid == hotKeyDic["Q"])
                            {
                                Messenger.Default.Send<Key>(Key.Q, "KeyDownButton");
                            }
                            else if (sid == hotKeyDic["P"])
                            {
                                Messenger.Default.Send<Key>(Key.P, "KeyDownButton");
                            }
                            handled = true;
                            break;
                        }
                }
                return IntPtr.Zero;
            }

    就是最后被拦截后,我应该怎样让其他软件,可以继续获取被我拦截的按钮。

    2020年7月15日 3:38
  • 要其他程序能够继续处理输入,你就不能用RegisterHotKey,这两个是冲突的。

    你这需求得用全局键盘钩子。



    Visual C++ MVP

    2020年7月19日 15:57
    版主