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);
这是我的尝试:
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);