SDL 2如何检查“无修饰符”(键盘输入)

时间:2018-02-09 13:16:40

标签: sdl-2

这是我的尝试:

const bool MOD_NONE{SDL_GetModState() == KMOD_NONE};

if(MOD_NONE) std::cout << "none" << std::endl;

然而,这不起作用。为什么呢?

如果我打印SDL_GetModState()返回的整数值,而不按任何修饰符,则值为4096.还为什么?

1 个答案:

答案 0 :(得分:2)

查看SDL(2.0.5)源代码,这里是SDL_Keymod结构:

typedef enum
{
    KMOD_NONE = 0x0000,
    KMOD_LSHIFT = 0x0001,
    KMOD_RSHIFT = 0x0002,
    KMOD_LCTRL = 0x0040,
    KMOD_RCTRL = 0x0080,
    KMOD_LALT = 0x0100,
    KMOD_RALT = 0x0200,
    KMOD_LGUI = 0x0400,
    KMOD_RGUI = 0x0800,
    KMOD_NUM = 0x1000,
    KMOD_CAPS = 0x2000,
    KMOD_MODE = 0x4000,
    KMOD_RESERVED = 0x8000
} SDL_Keymod;

调用SDL_GetModState时获得的值4096对应于&#34; Num Lock&#34;键(不需要物理按下以激活,就像Caps Lock键一样)。

你可能想要的是检查Alt,Shift,Ctrl和Gui键(Gui键是特殊的操作系统专用键,如果我没有弄错的话)。

const SDL_Keymod modkeys = KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_GUI;
const bool MOD_NONE{(SDL_GetModState() & modkeys) == KMOD_NONE};
// or simply
const auto modkeys = KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_GUI;
const bool MOD_NONE = !(SDL_GetModState() & modkeys);