用C/C++滚动自己的键盘/输入系统

zeb*_*und 16 c c++ keyboard winapi visual-c++

题:

学习如何创建自己的输入/输出系统需要什么样的资源?

我自己的理解:

我知道这是依赖于操作系统的,所以让我们分开Linux和Windows并列出两个操作系统的资源(如果可能的话).对于Linux,我猜测需要对X Window系统有一定的了解.对于Windows,我猜测win32API.尽管如此,我猜测还有更多内容,而不仅仅是知道这些,好像我希望用C++编写输入系统.

询问理由:

我尝试阅读OIS源代码(因为这将用C或写入C++),并且不喜欢它的编写方式.因此,我自己学会了如何编写自己的键盘输入/输出系统来进行简单的乒乓球游戏(书面编写C++).

Die*_*Epp 38

更新:这是我为处理键盘输入而编写的库.它使用FreeBSD许可证.我甚v1.0至把它标记为,所以我认为它是"发布质量".

https://github.com/depp/keycode

我最近努力工作以使游戏"恰到好处",我还没有完成.我会分享我所知道的.

密码

对于游戏,关键代码通常是您想要的.

当您按下键盘上的某个键时,操作系统会首先将按钮按下转换为键码.密钥代码指定键盘上键的物理位置.例如,代码4可能对应A于美国键盘上标记的键(即使该键在法国或俄罗斯具有不同的标签).每个平台都有一组不同的密钥代码,或者可能有多组密钥代码.您可以通过其他名称了解它们,例如扫描代码虚拟键代码.

  • Windows使用虚拟密钥代码(MSDN文档).它们在各种硬件和软件配置中都很稳定.您可以在<Winuser.h>头文件中找到定义.在Windows上,如果按最左侧的主行键(A在美国,Q在法国),则会得到代码65.

  • Mac OS X具有自80年代以来一直稳定的密钥代码.它们的定义是<Carbon/Events.h>.您实际上不需要链接到Carbon来使用密钥代码,但您需要标头.在OS X上,如果按最左侧的主行键,则会得到代码4.

  • Linux有几组不同的密钥代码.所以在Linux上,你有几个选择.你可以使用关键的syms(它有我将在下面解释的缺点),你可以假设用户正在使用特定的输入驱动程序(这些天Evdev是一个非常好的猜测),或者你可以以某种方式找出哪个输入驱动程序机器使用.要获取密钥代码,您必须阅读键盘定义文件.例如,查看/usr/share/X11/xkb/keycodes/evdevEvdev密钥代码.使用Evdev,如果按最左侧的主行键,则会得到代码38.

当然,如果关键代码在不同平台上是相同的,那就太容易了.您可以使用特定于平台的密钥代码,也可以将其转换为与平台无关的值.我建议使用USB HID代码(pdf)作为独立于平台的代码,因为许多聪明的人已经遇到了同意每个密钥调用的麻烦.

我上面发布的库有每个平台的表格,例如WIN_NATIVE_TO_HID将密钥代码转换为USB HID代码.

困难的部分是向用户传达他们应该按什么按钮,但至少来自其他国家的人可以玩你的游戏.

字符代码

您不想使用字符代码,即使您居住在美国并且您的受众也居住在美国,它们更容易使用.

在将按钮翻译成键代码之后,OS然后将键代码翻译成字符代码.字符代码受当前键盘布局的影响,并且通常也受修饰键的影响.

因此,如果您按下A键盘,您将获得键码65,4或38,具体取决于您所使用的平台.但是您将获得字符代码'a''A'取决于shift键是否已关闭,或者'Q'如果键盘布局设置为法语,或者'?'键盘布局设置为俄语,则可能获得.因此,如果您将WASD编码到游戏中并使用字符代码,当来自其他国家/地区的某人玩您的游戏时,输入将完全被破坏.你必须在法国使用ZQSD,在俄罗斯使用ÖФЫВ,很快你就会头疼.

我自己使用非QWERTY布局(Dvorak),大多数游戏都被彻底打破.在W键的位置,,<如果你有shift键,那就变成了,而且有些游戏不能识别为同一个键.例如,我按下,向前移动,但是如果我在换档键停止时释放按钮,那么游戏就会认为我已经释放了它<并且认为它,仍然没有停止,所以我会继续前进.即使我切换到美国键盘布局(我认为这是SDL中的一个小故障),大多数使用SDL的游戏都会在我的Mac上被打破.

LibSDL

SDL 2.0提供与平台无关的密钥代码,称为扫描代码.使用"SDL_scancode.h"标题.SDL开发人员得出的结论是扫描代码应该转换回USB HID代码,因此SDL扫描代码与我上面发布的库完全兼容(参见keycode.hSDL_scancode.h,数值相同) ).

由于这个原因和其他原因,如果您使用的是SDL 1.2,我强烈建议您升级到2.0.

  • 实际上,对于Windows,此答案是错误的,VK_代码与硬件无关,但与布局无关,请尝试将您的布局切换为法语,并查看键对VK_Q的响应。Windows需要使用的是扫描代码。 (2认同)