将copilot键映射为右control - 参考powertoys实现

引言

(本文只是分享)

这个需求,不用多说。我是看不出来目前copilot在电脑上的必要性的,我都用网页版。而且就算有,我也没必要专门按这个键,反正那webview2 app启动的时间才是大头,而且我有launch-app。

据我所知,成熟的软件里,大概只有powertoys能够映射copilot的快捷键(L win+L Shift+F23)。(小微软真逆天,用快捷键和功能键绑copilot键)

但如果我只需要改这一个键呢,万一我除了keymanager用不到PowerToys呢?已经有不少人写了对应的脚本了,但是我希望一个能够平替功能的实现:

  • 开机自启
  • 在绝大多数窗口都管用

必须是管理员,否则那些高级别运行的窗口根本碰不到,那直接设置开机自启,岂不是每次都要弹UAC。不行,只能使用开机计划任务。

我的答案:C2RC - gitee。(点击发行版可获取可执行文件)

快捷键映射

参考powertoys,这个很简单:

cpp 复制代码
// 键盘钩子回调
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam;

        // 忽略由程序注入的按键,防止死循环
        if (!(p->flags & LLMHF_INJECTED)) {

            // 检测 Copilot F23
            if (p->vkCode == 0x86) {

                // 处理按下事件
                if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
                    // Win抬起 + Shift抬起 + RCtrl按下
                    std::vector<INPUT> inputs;
                    INPUT input = { 0 };

                    // 强制抬起 Left Win
                    input.type = INPUT_KEYBOARD;
                    input.ki.wVk = VK_LWIN;
                    input.ki.dwFlags = KEYEVENTF_KEYUP;
                    inputs.push_back(input);

                    // 强制抬起 Left Shift
                    input.ki.wVk = VK_LSHIFT;
                    input.ki.dwFlags = KEYEVENTF_KEYUP;
                    inputs.push_back(input);

                    // 按下 Right Control
                    input.ki.wVk = VK_RCONTROL;
                    input.ki.dwFlags = 0;
                    inputs.push_back(input);

                    SendInput((UINT)inputs.size(), inputs.data(), sizeof(INPUT));
                    return 1; // 拦截 F23
                }

                // 处理抬起事件
                else if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) {
                    INPUT input = { 0 };
                    input.type = INPUT_KEYBOARD;
                    input.ki.wVk = VK_RCONTROL;
                    input.ki.dwFlags = KEYEVENTF_KEYUP; // 抬起 RCtrl

                    SendInput(1, &input, sizeof(INPUT));
                    return 1; // 拦截 F23
                }
            }
        }
    }
    return CallNextHookEx(hhkLowLevelKybd, nCode, wParam, lParam);
}

注意按下时需要强制抵消win和shift(清理残余),否则copilot+s就变成R ctrl + L Shift + s了,保存变另存为,扯不扯。

使用方法以及开机计划

C2RC.exe随便放到一个地方,首次点击时,需要管理员身份,允许运行就行了。

首次运行时,会尝试创建名为CopilotToRControlTask的开机计划任务。以后就不用管了。

如果不小心动了位置,或者删掉再下回来的时候没放在原来的位置?无所谓,跟第一次运行一样,以管理员身份运行后,程序会找到CopilotToRControlTask并更新为当前的位置。

相关推荐
浪浪小洋4 小时前
c++ qt课设定制
开发语言·c++
charlie1145141914 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler014 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
香蕉鼠片6 小时前
MFC是什么
c++·mfc
心态与习惯6 小时前
Julia 初探,及与 C++,Java,Python 的比较
java·c++·python·julia·比较
小欣加油7 小时前
leetcode2078 两栋颜色不同且距离最远的房子
数据结构·c++·算法·leetcode·职场和发展
我真不是小鱼7 小时前
cpp刷题打卡记录30——轮转数组 & 螺旋矩阵 & 搜索二维矩阵II
数据结构·c++·算法·leetcode
南境十里·墨染春水7 小时前
C++ 笔记 thread
java·开发语言·c++·笔记·学习
南境十里·墨染春水7 小时前
C++ 笔记 高级线程同步原语与线程池实现
java·开发语言·c++·笔记·学习
瞎折腾啥啊8 小时前
CMake FetchContent与ExternalProject
c++·cmake·cmakelists