我在 Linux 中有一个全局按键事件处理程序,如下所示。我需要知道哪个键盘被抓住了。例如,如果按下“P”键,我会得到相应的键代码。有没有办法从这个未签名的密钥代码中获取密钥名称(“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
字段,你可以得到KeySym
使用XkbKeycodeToKeysym
函数,然后是按下的键的文本表示,传递KeySym
to the 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键入方括号)。
请注意,返回的字符串实际上是一个name识别键盘符号,例如,a
, b
, c
or X
对于字母,但是comma
, or backslash
对于其他符号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)