0

我想在 freepascal 下使用 SDL 从键盘读取 ascii 键。我不关心 shift、ctrl、caps 等的按下 - 只是在典型应用程序中键入时通常会产生字符的东西。

问题是我似乎无法正确检测 KMOD_CAPS。如果您多次按下它,对于相同的 CAPS 状态,您最终会得到不同的结果。

这是我到目前为止所拥有的:

program ReadKeySDL;
{SDL implementation of the crt readkey function.}

uses
    sdl;

const
    validkeys=[8,13,27,32..126];
    lowercase=[97..122];

var
    screen          :   pSDL_Surface;
    event           :   pSDL_Event;
    eventkey        :   tSDLKey;
    eventmod        :   tSDLMod;
    key             :   char;
    keyselected     :   boolean;


BEGIN


    SDL_Init(SDL_INIT_VIDEO);
    screen:=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
    if (screen=nil) then halt(1);

    new(event);
    repeat
        keyselected:=false;
        repeat
            if (SDL_WaitEvent(event) = 1) then
            begin
                if (event^.type_ = SDL_KeyDown) then
                begin
                    eventkey:=event^.key.keysym.sym;
                    eventmod:=event^.key.keysym.modifier;
                    writeln;
                    writeln('eventkey: ',eventkey);
                    writeln('eventmod: ',eventmod);
                    if (eventkey in validkeys) then
                    begin
                        keyselected:=true;
                        if ((eventkey in lowercase) and ((eventmod and (KMOD_CAPS or KMOD_SHIFT)) <> 0)) then
                            key:=chr(eventkey - 32)
                        else
                            key:=chr(eventkey);
                    end;
                end;
            end;
        until((keyselected) and (event^.type_ = SDL_KeyUp));
        writeln('Your key is: ',key,' (',ord(key),')');
        writeln('Final eventkey: ',eventkey);
        writeln('Final eventmod: ',eventmod);
    until(ord(key) = 27);
    dispose(event);


    SDL_FreeSurface(screen);
    SDL_Quit;

END.
4

0 回答 0