Windows VNC:将Qt KeyEvent转换为可用的X11/RFB keysym

Windows VNC:将Qt KeyEvent转换为可用的X11/RFB keysym,windows,qt,vnc,qkeyevent,Windows,Qt,Vnc,Qkeyevent,背景:我目前正在创建一个嵌入在QWidget中的简单VNC查看器,用于Windows。为此,我编译了(KDE远程桌面查看器)的Qt-only VNC版本及其在windows上的依赖项libvncclient。然而,现在出现的问题在于krdc通过vnc发送关键事件的方式:它只发送QKeyEvent::nativeVirtualKey()的值,该值在X11上已经是有效的RFB keysym。但在Windows上,情况并非如此 现在,为了解决这个问题,我认为最好的(最终也是可移植的)方法是将Qt的QK

背景:我目前正在创建一个嵌入在QWidget中的简单VNC查看器,用于Windows。为此,我编译了(KDE远程桌面查看器)的Qt-only VNC版本及其在windows上的依赖项libvncclient。然而,现在出现的问题在于krdc通过vnc发送关键事件的方式:它只发送QKeyEvent::nativeVirtualKey()的值,该值在X11上已经是有效的RFB keysym。但在Windows上,情况并非如此

现在,为了解决这个问题,我认为最好的(最终也是可移植的)方法是将Qt的QKeyEvent::key()和::modifier()数据转换回有效的X11/RFB KeySym。这似乎有点复杂,但考虑到我需要根据修饰符状态选择不同的键符号(XK_a vs XK_a,我到目前为止只考虑了移位)。研究如何在Qt的源代码中完成X11->Qt转换也没有真正的帮助


可能已经有一个库或代码片段实现了这一点?还是我应该试着编写自己的(不完整的)翻译例程?如果是这样,那么最好的解决方法是什么?还有,我是否应该注意与X11相关的其他注意事项?

嗯,似乎我实际上是瞎子;krdc的代码中有一个引用,就在e->nativeVirtualKey()语句的正下方,引用了另一个项目,在那里他们遇到了与我完全相同的问题:

// hmm, either Win32-platform or too old Qt so we have to handle and
// translate Qt-key-codes to X-keycodes
我没有测试他们的解决方案,但看起来很可靠。因为我现在才发现这一点,所以我自己已经编写了一个小例程,对于大多数拉丁键盘来说应该可以正常工作(但如果Qt团队更改任何Qt::Key值,可能会中断),如果有人对此感兴趣: