SDL 键盘事件监控

#include <stdlib.h>

#include "SDL.h"

//#pragma comment(lib, "SDL.lib")

// Screen width
#define WIDTH 480
// Screen height
#define HEIGHT 320

#define SAFE_RELEASE(p)      { if(p != NULL) { SDL_FreeSurface(p); (p)=NULL; } }

SDL_Surface *gScreen;

void OnKeyUp(SDL_KeyboardEvent *key);

void PrintModifiers( SDLMod mod );

int main(int argc, char *argv[])
{
 // Initialize SDL's subsystems
 if (SDL_Init(SDL_INIT_VIDEO) < 0)
 {
  fprintf(stderr, "Unable to init SDL: %s/n", SDL_GetError());
  exit(1);
 }

 int       done   = 0;
 
 SDL_Event event;
 SDL_EnableUNICODE( 1 );

 atexit(SDL_Quit);
 
 gScreen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_SWSURFACE);
 
 //init();
 
 // If we fail, return error.
 if (gScreen == NULL)
 {
  fprintf(stderr, "Unable to set up video: %s/n", SDL_GetError());
  exit(1);
 }
 
 // Main loop: loop forever.
 while ( !done )
 {
  while(SDL_PollEvent(&event))
  {
   switch (event.type)
   {
   case SDL_KEYDOWN:
    {
     if(event.key.keysym.sym == SDLK_ESCAPE)
      done = true;
     
    }
    break;
   case SDL_KEYUP:
    {
     
     OnKeyUp(&event.key);
    }
    break;
   }
  }
 }
 SAFE_RELEASE(gScreen);
 SDL_Quit();
 return 0;
}

void OnKeyUp(SDL_KeyboardEvent *key)
{
 /* Is it a release or a press? */
 if( key->type == SDL_KEYUP )
  printf( "Release:- " );
 else
  printf( "Press:- " );
 
 /* Print the hardware scancode first */
 printf( "Scancode: 0x%02X", key->keysym.scancode );
 /* Print the name of the key */
 printf( ", Name: %s", SDL_GetKeyName( key->keysym.sym ) );
 /* We want to print the unicode info, but we need to make */
 /* sure its a press event first (remember, release events */
 /* don't have unicode info                                */
 if( key->type == SDL_KEYDOWN ){
  /* If the Unicode value is less than 0x80 then the    */
  /* unicode value can be used to get a printable       */
  /* representation of the key, using (char)unicode.    */
  printf(", Unicode: " );
  if( key->keysym.unicode < 0x80 && key->keysym.unicode > 0 ){
   printf( "%c (0x%04X)", (char)key->keysym.unicode,
    key->keysym.unicode );
  }
  else{
   printf( "? (0x%04X)", key->keysym.unicode );
  }
 }
 printf( "/n" );
 /* Print modifier info */
 PrintModifiers( key->keysym.mod );
}

/* Print modifier info */
void PrintModifiers( SDLMod mod ){
 printf( "Modifers: " );
 
 /* If there are none then say so and return */
 if( mod == KMOD_NONE ){
  printf( "None/n" );
  return;
 }
 
 /* Check for the presence of each SDLMod value */
 /* This looks messy, but there really isn't    */
 /* a clearer way.                              */
 if( mod & KMOD_NUM ) printf( "NUMLOCK " );
 if( mod & KMOD_CAPS ) printf( "CAPSLOCK " );
 if( mod & KMOD_LCTRL ) printf( "LCTRL " );
 if( mod & KMOD_RCTRL ) printf( "RCTRL " );
 if( mod & KMOD_RSHIFT ) printf( "RSHIFT " );
 if( mod & KMOD_LSHIFT ) printf( "LSHIFT " );
 if( mod & KMOD_RALT ) printf( "RALT " );
 if( mod & KMOD_LALT ) printf( "LALT " );
 if( mod & KMOD_CTRL ) printf( "CTRL " );
 if( mod & KMOD_SHIFT ) printf( "SHIFT " );
 if( mod & KMOD_ALT ) printf( "ALT " );
 printf( "/n" );
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值