gpt4 book ai didi

c++ - 从键码中获取键名(X11 XGrabKey)

转载 作者:行者123 更新时间:2023-11-27 23:47:27 28 4
gpt4 key购买 nike

我在 linux 中有一个全局键事件处理程序,如下所示。我需要知道哪个键盘被捕获了。例如,如果按下“P”键,我会得到相应的键码。有没有办法从这个未签名的 key 代码中获取 key 名称(“P”)?

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

#include <QtX11Extras/QX11Info>

void EventFilter::setup(QWidget *target)
{
this->target = target;

Display * display = QX11Info::display();
unsigned int modifiers = ControlMask;
keycode = XKeysymToKeycode(display, XK_A);
XGrabKey(display, keycode, modifiers, DefaultRootWindow(display), 1, GrabModeAsync, GrabModeAsync);
}

bool EventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *)
{
if (eventType == "xcb_generic_event_t")
{
xcb_generic_event_t* xcbevent = static_cast<xcb_generic_event_t *>(message);

switch(xcbevent->response_type)
{
case XCB_KEY_PRESS:
xcb_key_press_event_t * keypress_event = static_cast<xcb_key_press_event_t *>(message);
if(keypress_event->state & XCB_MOD_MASK_CONTROL)
{
if(keypress_event->detail == keycode)
{
//print key name here
}
}
}
}
return false;
}

最佳答案

给定一个键码,从事件detail字段,你可以使用XkbKeycodeToKeysym函数得到KeySym,然后是一个文本表示按下的键,将 KeySym 传递给 XKeysymToString 函数。

有这个额外的包括:

#include <X11/XKBlib.h>

然后,在事件处理程序中:

case XCB_KEY_PRESS:
xcb_key_press_event_t * keypress_event = static_cast<xcb_key_press_event_t *>(message);
xcb_keycode_t code = keypress_event->detail;
qDebug() << XKeysymToString( XkbKeycodeToKeysym(QX11Info::display(), code, 0, 0) );

在上面的示例中,0 的索引作为 XkbKeycodeToKeysym 的最后一个参数传递。这将返回按下的键的符号,就好像没有按下 shift 键(或大写锁定,或任何其他修饰键)一样。传递 1 的索引将返回符号,就像按下 shift 键一样。其他值(即 2)将产生一个符号,按下更多修饰键(例如,在我的意大利语键盘中,我必须按 Alt Gr 才能键入方括号)。

请注意,返回的字符串实际上是一个名称来标识键盘符号,例如可以是ab , cX 表示字母,commabackslash 表示其他符号。

关于c++ - 从键码中获取键名(X11 XGrabKey),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49491918/

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