C++ Linux下如何捕捉键盘布局变化
这是我的名片。我试图用下面的平台相关代码来解决这个问题。在窗户上,一切正常。但在Linux上,我无法获得语言名称,只能获得国家名称。另外,我不知道什么消息(在Linux上)与键盘布局更改事件相关。我用过Linux部分C++ Linux下如何捕捉键盘布局变化,c++,linux,qt,qt5,C++,Linux,Qt,Qt5,这是我的名片。我试图用下面的平台相关代码来解决这个问题。在窗户上,一切正常。但在Linux上,我无法获得语言名称,只能获得国家名称。另外,我不知道什么消息(在Linux上)与键盘布局更改事件相关。我用过Linux部分 bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result) { #ifdef Q_OS_WIN MSG* msg = reinterpret_cast&
bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
#ifdef Q_OS_WIN
MSG* msg = reinterpret_cast<MSG*>(message);
if(msg && msg->message == WM_INPUTLANGCHANGE)
{
HKL hkl_id = GetKeyboardLayout(0);
int lang_id = LOWORD(hkl_id);
wchar_t buf[11] = {0};
GetLocaleInfo( MAKELCID(lang_id, SORT_DEFAULT),
LOCALE_SISO639LANGNAME,
buf,
10);
qDebug() << QString::fromWCharArray(buf); // "EN"
}
#endif // Q_OS_WIN
#ifdef Q_OS_LINUX
xcb_generic_event_t* ev = reinterpret_cast<xcb_generic_event_t *>(message);
if(ev)
{
switch (ev->response_type & ~0x80)
{
case XCB_KEY_PRESS:
{
qDebug() << endl;
XKeyboard xkb;
qDebug() << QString::fromStdString(xkb.currentGroupSymbol()); // "US"
}
break;
}
}
#endif // Q_OS_LINUX
return QMainWindow::nativeEvent(eventType, message, result);
}
bool主窗口::nativeEvent(常量QByteArray和事件类型、void*消息、long*结果)
{
#如果你赢了
MSG*MSG=reinterpret_cast(消息);
如果(msg&&msg->message==WM\u INPUTLANGCHANGE)
{
HKL HKL_id=GetKeyboardLayout(0);
int lang_id=LOWORD(hkl_id);
wchar_t buf[11]={0};
GetLocaleInfo(MAKELCID(lang\u id,SORT\u默认值),
语言环境_SISO639LANGNAME,
缓冲器,
10);
qDebug()响应类型&~0x80)
{
案例XCB_键按:
{
qDebug()尝试keymappnotify
事件。另外xkb\u keymap\u布局\u获取\u名称
。