在ubuntu中如何模拟ctrl+c实现复制?

在ubuntu中如何模拟ctrl+c实现复制?

我想在Ubuntu中实现复制信号的模拟,如下:

  1. 注册一个快捷键,例如Ctrl+ 1
  2. 当用户在任意窗口中选中文本内容,按下此快捷键Ctrl+时1,程序就能模拟Ctrl+ C,向系统发送系统复制信号,然后将用户选中的内容写入到剪贴板中。

简单来说,我期望的效果就是,在程序运行时(如下图),我在屏幕上的任意一个窗口中选中一段文本,按下快捷键Ctrl+ 1,其效果可以相当于Ctrl+的效果c,我选中的这段文本会被自动写入到剪贴板。

但是从现在的运行结果来看,可以注册并识别快捷键Ctrl+ 1,但是并没有达到真正的Ctrl+c复制效果,我的程序是这样的:

#include <QTextStream>
#include <QCoreApplication>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include <X11/extensions/XTest.h>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Display* dpy = XOpenDisplay(nullptr);
    Window root = DefaultRootWindow(dpy);
    XEvent ev;

    // Register the shortcut
    unsigned int modifiers = ControlMask; // ctrl
    KeyCode keycode = XKeysymToKeycode(dpy, XK_1); // 1
    if (XGrabKey(dpy, keycode, modifiers, root, True, GrabModeAsync, GrabModeAsync)) {
        qDebug() << "Hotkey registered!" << endl;
    } else {
        qDebug() << "Failed to register hotkey." << endl;
        return -1;
    }

    while (true) {
        XNextEvent(dpy, &ev);
        if (ev.type == KeyPress && ev.xkey.keycode == keycode) {
            qDebug() << "Hotkey pressed!";

            // Simulate ctrl+c to copy
            Display *display = XOpenDisplay(nullptr);
            if(display == nullptr)
            {
                return -1;
            }

            KeyCode ctrlKey = XKeysymToKeycode(display, XK_Control_L);
            KeyCode cKey = XKeysymToKeycode(display, XK_C);
            XTestFakeKeyEvent(display, ctrlKey, True, 0);
            XTestFakeKeyEvent(display, cKey, True, 0);
            XTestFakeKeyEvent(display, cKey, False, 0);
            XTestFakeKeyEvent(display, ctrlKey, False, 0);
            qDebug() << "send ctrl+c";
            XFlush(display);
            XCloseDisplay(display);
        }
    }
    return a.exec();
}

有人能给我一些建议吗?

(为什么不直接用ctrl+c呢?因为还有后续的处理过程~~)

答案1

您需要使用输入重新映射器:

sudo apt update && sudo apt install input-remapper

转到应用程序,搜索“输入重新映射器”。

从设备列表中选择您的键盘,创建或仅使用当前的“预设”。

单击“新条目”,然后按键盘上的 ctrl+1。之后,输入您的地图键(在本例中为 ctrl+shift+c)。

最后,点击“应用”。

您已准备好使用 ctrl+1 在 X11 和终端上模拟 ctrl+c。

相关内容