如何在SDL2中正确处理控制键组合

5
在我的基于SDL 2.0的应用程序中,我想要处理Control +Control =这两个组合键。我知道我可以处理SDL_KEYDOWN事件,并查找与KEYMODE_CTRL组合使用的SDLK_EQUALS键代码,甚至检查KEYMOD_SHIFT以区分+和=。但是,这种方法不具备可移植性,而且在将这些符号映射到不同键的键盘上会出现问题。
我尝试过的另一件事是启用SDL_StartTextInput(),然后监听SDL_TEXTINPUT事件。然而,这仅适用于可打印字符。它完全忽略了控制序列。
那么正确的方法是什么呢?我看到SDL 1.2实际上在SDL_Keysym结构中有一个unicode字段。这肯定会让我的工作更容易。有人知道为什么它被删除了,在SDL 2.0中的等效方法是什么吗?

我认为它已被文本输入事件所取代,请查看https://wiki.libsdl.org/Tutorials/TextInput - keltar
@keltar 问题在于 TextInput 吞噬了控制键。它只对可打印字符起作用。我可以阅读代码,看看它是如何内部工作的,然后可能构建类似的东西,但我不想这样做。 - Stefan Arentz
但是如果它不是输入序列的一部分,您仍然可以为ctrl设置keydown事件,因此您可以将两者结合起来。 - keltar
但是你有一个用于“+”和SDL_KEYDOWN来控制的ctrl键吗?(至少我有) - keltar
@StefanArentz,您能否请检查我的问题链接1 链接2。我认为您可以给我答案。 - ZAFAR007
显示剩余2条评论
1个回答

6
以下是一个示例,展示如何将Unicode输入作为SDL_TEXTINPUT获取,而其余内容则作为SDL_KEYDOWN获取:
#include "SDL.h"
#include <stdio.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代替手动处理事件和累积修改器键标志,结果相同。

这是一个非常好的例子。但是也许你想加上 #include <stdio.h> 让它更完美... - Zvika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接