结构SDL_Keysym
有SDL_Scancode
和SDL_Keycode
成员.他们之间有什么区别?文档并没有真正为我清除它.我试过两个,他们似乎做同样的事情.
所以我在这里提到了一个pi零键盘模拟器:
https://www.rmedgar.com/blog/using-rpi-zero-as-keyboard-setup-and-device-definition
我创建了它从本地文本文件中读取的类型文本(在java中开发的所有东西 - 原因:)).
我现在的问题是我的pi零附加的各种计算机上配置的键集差异很大(德语,英语,法语......).这取决于计算机,这会导致几个打字错误(例如,z而不是y).
所以我现在建立了一些"转换表",将字符映射到适合计算机的键码.这样的表看起来像这样:
public scancodes_en_us() {
//We have (Character, (scancode, modifier))
table.put("a",Pair.create("4","0"));
table.put("b",Pair.create("5","0"));
table.put("c",Pair.create("6","0"));
table.put("d",Pair.create("7","0"));
table.put("e",Pair.create("8","0"));
table.put("f",Pair.create("9","0"));
table.put("g",Pair.create("10","0"));
table.put("h",Pair.create("11","0"));
table.put("i",Pair.create("12","0"));
table.put("j",Pair.create("13","0"));
table.put("k",Pair.create("14","0"));
table.put("l",Pair.create("15","0"));
table.put("m",Pair.create("16","0"));
table.put("n",Pair.create("17","0"));
table.put("o",Pair.create("18","0"));
table.put("p",Pair.create("19","0"));
table.put("q",Pair.create("20","0"));
table.put("r",Pair.create("21","0"));
table.put("s",Pair.create("22","0"));
table.put("t",Pair.create("23","0"));
table.put("u",Pair.create("24","0"));
table.put("v",Pair.create("25","0"));
table.put("w",Pair.create("26","0"));
table.put("x",Pair.create("27","0"));
table.put("y",Pair.create("28","0"));
table.put("z",Pair.create("29","0"));
table.put("A",Pair.create("4","2"));
table.put("B",Pair.create("5","2"));
table.put("C",Pair.create("6","2"));
table.put("D",Pair.create("7","2"));
table.put("E",Pair.create("8","2"));
table.put("F",Pair.create("9","2"));
table.put("G",Pair.create("10","2"));
table.put("H",Pair.create("11","2"));
table.put("I",Pair.create("12","2"));
table.put("J",Pair.create("13","2"));
table.put("K",Pair.create("14","2"));
table.put("L",Pair.create("15","2"));
table.put("M",Pair.create("16","2"));
table.put("N",Pair.create("17","2"));
table.put("O",Pair.create("18","2"));
table.put("P",Pair.create("19","2"));
table.put("Q",Pair.create("20","2"));
table.put("R",Pair.create("21","2"));
table.put("S",Pair.create("22","2"));
table.put("V",Pair.create("25","2"));
table.put("W",Pair.create("26","2"));
table.put("X",Pair.create("27","2"));
table.put("Y",Pair.create("28","2"));
table.put("Z",Pair.create("29","2"));
table.put("1",Pair.create("30","0"));
table.put("2",Pair.create("31","0"));
table.put("5",Pair.create("34","0"));
table.put("6",Pair.create("35","0"));
table.put("7",Pair.create("36","0"));
table.put("8",Pair.create("37","0"));
table.put("9",Pair.create("38","0"));
table.put("0",Pair.create("39","0"));
table.put("!",Pair.create("30","2"));
table.put("@",Pair.create("31","2"));
table.put("#",Pair.create("32","2"));
table.put("$",Pair.create("33","2"));
table.put("%",Pair.create("34","2"));
table.put("^",Pair.create("35","2"));
table.put("&",Pair.create("36","2")); …
Run Code Online (Sandbox Code Playgroud) 我想与Virtualbox-VM进行交互,以无人值守地安装Virtualbox-Guest-Additions.因此,我必须向VM发送击键.我可以通过使用VBoxManage-API来实现这一点,我将扫描码的HEX发送到VM:
# sends "b" to the VM
VBoxManage controlvm "$VMNAME" keyboardputscancode <HEX>
Run Code Online (Sandbox Code Playgroud)
现在我想向VM发送一个完整的命令,例如:
mount /dev/scd0 /media/cdrom0<Enter>
Run Code Online (Sandbox Code Playgroud)
因此,我必须将该字符串的每个字符转换为扫描码,并使用VBoxManage将其发送到VM.
如何将这些字符转换为Linux上相应的键盘扫描码?我的VM具有与主机相同的键盘映射.我正在寻找可以使用的东西:
$ getscancode n
> 31
Run Code Online (Sandbox Code Playgroud)
?
void WriteChar(char c)
{
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wVk= VkKeyScanEx(c, GetKeyboardLayout(0) ) ;
SendInput(1,&input, sizeof(INPUT));
}
Run Code Online (Sandbox Code Playgroud)
VkKeyScanEx为'/'和'?'(相同的键)返回不同的键代码,但是如果您尝试使用此方法编写包含'?'的消息,则只会写'/'.我不知道发生了什么事.同样的事情发生在';' 和':'.
我部分不了解密钥代码和扫描代码.大多数角色都有虚拟键码,但我找不到类似问号的东西.它们必须存在,但没有列出?
我是linux编程的新手.:-)
我只是想知道我的程序(使用C语言)是否可以立即捕获linux中的每一个键击,然后决定是否回显它以及如何显示它,就像telnet一样.
例如,如果用户敲击"A",我希望程序显示"B",如果他输入"B",则需要"C",依此类推.
听起来很有趣也没用.我只是好奇.
Tkinter 有没有办法绑定可以在所有键盘布局中使用的键组合?(通过扫描码绑定)
例如,我需要在所有布局中使用键盘左下角相同物理键的'Control-Z'
绑定,例如:
* 俄语布局、
* 希腊语布局等。
这是我尝试过的:
from Tkinter import *
root=Tk()
def f(event):
print 'undo'
button1=Button(root, text=u'Button')
button1.pack()
button1.bind('<Control-z>', f)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
它不适用于俄语和希腊语键盘布局。
更新 2:
我用 Windows 做了一些更多的实验,现在一般规则是这样的:
1) 如果语言基于拉丁字符集,键将“按值”映射(德语、法语、德沃夏克),以便将相同的操作映射到不同的物理键。
2)如果不是(例如 俄语,希腊语),则所有主要加速键都“按位置”映射(以匹配通常标记在同一键上的相应英文字母)。
只有第二种情况需要特别注意。如果这已经在某些库中实现了,有什么想法吗?
更新 3
即使没有俄语键盘或俄语 Windows,它也可以简单地复制。
1) 开始->控制面板->区域和语言选项
2) 语言->详细信息
3) 添加俄语。
就是这样。现在 Alt-Shift 会将您切换到俄语,您将能够输入以下有趣的符号:
另一个 Alt-Shift 会将您切换回来。
忘记维基百科关于语音俄语布局的说法。这些天不使用它们。至少在俄罗斯境内。
所有 Windows 应用程序(包括 wxPython 应用程序)都Ctrl-?
用于撤消、Ctrl-?
剪切、Ctrl-?
复制等。
我们一直在努力了解Linux中的键盘扫描码行为.
当我们打开一个普通的bash shell时,箭头键按预期工作:UP显示历史记录中的上一个项目等.但是,当您生成一个进程时,箭头不再按预期工作.例如,UP打印^ [[A而不是上一个命令.
要证明这一点,请执行以下操作:
bash $ ping www.google.com
现在,按UP或DOWN等等,您将在进程运行时看到错误映射的密钥代码.但是,当您终止该过程时,箭头键将再次起作用.
我们已经在CentOs,Ubuntu,Mac甚至是不同的shell(bash,sh,zsh)上测试过它,并且在任何地方都会发生同样的情况.我还尝试了使用kbd_mode的不同键盘模式,我们使用RAW和XLATE模式进行了测试.
在搜索答案时我能看到的最接近的东西是当IPython没有针对readline构建时,IPython用户经历了相同的行为.但是,据我所知,这与我们的案例无关.
我们正在开发一个基于C++ Tcl的控制台应用程序,它使用cin和cout与用户进行通信并获取输入.当我们尝试访问先前输入的命令的历史记录时,我们遇到箭头键问题.这对我们来说是一个主要问题,因为99%的人都希望箭头角色能够正常工作.
关于我们如何克服这一点的任何想法都将非常感激.
我正在尝试收听键盘输入(使用X11事件循环)并获取扫描码.这些扫描码应该指代密钥的物理位置,而不是它所键入的字符.问题是,我所能得到的只是KeySyms和KeyCodes,它们针对不同的语言进行了不同的映射(例如QWERTY vs QWERTZ).
我目前的解决方案是阅读"/ usr/share/X11/xkb/keycodes/evdev"文件.它包含密钥位置到密钥代码的映射.使用这个我可以简单地将任何键码转换回扫描码.我的猜测是,这不是一种稳定的做事方式.我根本不太了解Linux.这就是为什么我认为在这里问这可能是一个好主意.
假设大多数用户的机器正在使用这些evdev映射是否安全?如果没有,我还能在哪里找到实际使用的关键映射?或者是否有更好的解决方案?
Virtual Key Code
和 和有什么区别Scan Code
?我在这里读到有关扫描码的内容,但我不明白虚拟码的用途是什么以及扫描码与虚拟码有何不同?
例如在Java中:
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
int code = evt.getKeyCode(); // WHAT DO I GET ? A Scan code or a Virtual Code..?
}
Run Code Online (Sandbox Code Playgroud)
在C中:
KBDLLHOOKSTRUCT *kbhook = (KBDLLHOOKSTRUCT *) lParam;
printf("%u\n",kbhook->vkCode); // WHAT DO I GET ? A Scan code or a Virtual Code..?
Run Code Online (Sandbox Code Playgroud)
以上只是示例,我不想在此基础上澄清概念。
为什么它们与其他扫描代码分开?有什么理由吗?
F9 is 67
F10 is 68
Numlock is 69
F11 is 87
F12 is 88
Run Code Online (Sandbox Code Playgroud)