这是我的尝试:
const bool MOD_NONE{SDL_GetModState() == KMOD_NONE};
if(MOD_NONE) std::cout << "none" << std::endl;
然而,这不起作用。为什么呢?
如果我打印SDL_GetModState()
返回的整数值,而不按任何修饰符,则值为4096.还为什么?
答案 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);