SDL 2 如何检查 "no modifiers"(键盘输入)

SDL 2 how to check for "no modifiers" (keyboard input)

这是我的尝试:

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

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

但是这不起作用。为什么?

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

查看 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 对应于 "Num Lock" 键(无需物理按下即可激活,就像 Caps Lock 键一样)。

您可能想要检查 Alt、Shift、Ctrl 和 Gui 键(如果我没记错的话,Gui 键是特殊的 OS 特定键)。

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);