我想在Ubuntu中实现复制信号的模拟,如下:
- 注册一个快捷键,例如Ctrl+ 1。
- 当用户在任意窗口中选中文本内容,按下此快捷键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。