gpt4 book ai didi

keyboard-events - 如何正确处理 SDL2 中的控制键组合

转载 作者:行者123 更新时间:2023-12-03 23:57:35 24 4
gpt4 key购买 nike

在我基于 SDL 2.0 的应用程序中,我想同时处理 Control +Control = .

我知道我可以处理 SDL_KEYDOWN事件并寻找 SDLK_EQUALS键码与 KEYMODE_CTRL 结合使用.甚至检查 KEYMOD_SHIFT' to distinguish between + and =`。但是,这不是可移植的,并且在这些符号映射到不同键的键盘上会中断。

我尝试过的另一件事是启用 SDL_StartTextInput()然后听SDL_TEXTINPUT事件。但是,这只适用于可打印字符。它完全忽略控制序列。

这样做的正确方法是什么?我看到 SDL 1.2 实际上有一个 unicode SDL_Keysym 中的字段结构体。这对我来说肯定会容易得多。有谁知道为什么删除它以及 SDL 2.0 中的等效项是什么?

最佳答案

下面是一个示例,如何将 unicode 输入作为 SDL_TEXTINPUT 而其余的作为 SDL_KEYDOWN:

#include "SDL.h"

int main(int argc, char *argv[]) {
int done = 0;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *w = SDL_CreateWindow("foo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
640, 480, 0);

int lctrl = 0, rctrl = 0;

SDL_StartTextInput();
while (!done) {
SDL_Event event;
while(SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
done = 1;
break;
case SDL_TEXTINPUT: {
int ctrl_state = lctrl || rctrl;
printf("%s, ctrl %s\n", event.text.text, (ctrl_state) ? "pressed" : "released");
} break;
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_RCTRL) { rctrl = 1; }
else if(event.key.keysym.sym == SDLK_LCTRL) { lctrl = 1; }
break;
case SDL_KEYUP:
if(event.key.keysym.sym == SDLK_RCTRL) { rctrl = 0; }
else if(event.key.keysym.sym == SDLK_LCTRL) { lctrl = 0; }
break;
}
}
SDL_UpdateWindowSurface(w);
}

SDL_Quit();

return 0;
}

为简化起见,它忽略了 SDL_TEXTEDITING,这可能(也可能不是)是您想要的。还有 SDL_GetKeyboardState可以用来代替手动处理事件和累积修饰键标志,具有相同的结果。

关于keyboard-events - 如何正确处理 SDL2 中的控制键组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41570751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com