gpt4 book ai didi

c++ - 在 GNU/Linux 中使用键盘快捷键启动应用程序功能

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:27 50 4
gpt4 key购买 nike

我在 GNU/Linux 中使用 Qt 创建了一个应用程序,并在后台运行。我想在用户按下某些组合键时执行某些应用程序功能,例如 Ctrl+Alt+A...

我知道这是可能的,Gnome Pie做到了,但我不知道如何捕获 key 。我尝试使用 examples在这个问题中提供,但它们都不起作用......我也不想以 root 身份运行我的应用程序......

任何人都可以给我一些资源或给我一些提示吗?

编辑:

@iharob 建议我应该使用 libkeybinder。我找到了它,试过了,但它使用 GTK 并且 GTK 不能很好地与 Qt 一起玩...我什至不是 GTK 初学者,从未使用过它,但我认为 GTK 事件循环与 Qt 事件循环冲突;当我从回调中发出 Qt 信号时,该信号在按下键后被调用(也是在 gtk_init 被调用之后),应用程序崩溃。

如果我可以创建一个类,只要按下键盘组合键(例如 Ctrl+Alt+A)就会发出信号,那就太好了。

最佳答案

据我所知,@SamVarshavchik 指出,libkeybinder 在后台使用 libx11,因此您可以只使用 libx11 以摆脱对 Qt 不是很友好的 GTK 事件循环。 AFAIK KDEKAction 对其全局短键使用相同的技术,因此我认为该技术将与 Qt 的事件循环一起使用。

话虽如此,您可以使用所提供的热键示例 here :

x11_hot_key.pro:

#-------------------------------------------------
#
# Project created by QtCreator 2015-05-04T01:47:22
#
#-------------------------------------------------

QT += core

QT -= gui

TARGET = x11_hot_key
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

CONFIG += link_pkgconfig
PKGCONFIG += x11

ma​​in.cpp:

#include <QCoreApplication>

#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

using namespace std;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

Display* dpy = XOpenDisplay(0);
Window root = DefaultRootWindow(dpy);
XEvent ev;

unsigned int modifiers = ControlMask | ShiftMask;
int keycode = XKeysymToKeycode(dpy,XK_Y);
Window grab_window = root;
Bool owner_events = False;
int pointer_mode = GrabModeAsync;
int keyboard_mode = GrabModeAsync;

XGrabKey(dpy, keycode, modifiers, grab_window, owner_events, pointer_mode,
keyboard_mode);

XSelectInput(dpy, root, KeyPressMask );
while(true)
{
bool shouldQuit = false;
XNextEvent(dpy, &ev);
switch(ev.type)
{
case KeyPress:
cout << "Hot key pressed!" << endl;
XUngrabKey(dpy,keycode,modifiers,grab_window);
shouldQuit = true;

default:
break;
}

if(shouldQuit)
break;
}

XCloseDisplay(dpy);

return a.exec();
}

或者你可以只使用 this simple library如图所示 here其中还有一些简单的示例以及方便的 Makefile 供您使用。

由于我不了解 XGrabKey 的异步对应方,您将遇到的问题是 while(true) 循环永远不会返回并阻塞主thread 因此应用程序,所以你想要的是将它移动到一个单独的线程中,并使用 signalsslots 将它连接到主线程。不过,这应该不是什么大问题,也不会影响您的应用程序的性能,因为 AFAIK XNextEvent 会阻塞,直到您按下键,这样处理器就不会无用地处理...

希望这对您有所帮助。

关于c++ - 在 GNU/Linux 中使用键盘快捷键启动应用程序功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929397/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com