Jump to content
  • Advertisement
  • 11/12/99 10:06 AM
    Sign in to follow this  

    Converting Scan Codes to ASCII

    Graphics and GPU Programming
       (1 review)

    Myopic Rhino
    It is often the case in games, that keyboard input is needed to input text, rather than be used for usual game controls. This poses three basic problems:
    1. Key identifiers in DirectInput are keyboard scan codes.
    2. Various international keyboards map scan codes differently, according to their layout.
    3. The same scan code can be translated to various ASCII codes, depending on the status of the shift key, and other such cases.
    To solve this problem, we can use various Win32 API calls to resolve which ASCII code the key should be translated to.

    These are the steps we'll use:
    • We'll use GetKeyboardLayout() to get the current keyboard layout.
    • GetKeyboardState() will be used to retrieve the state of keys like shift, ctrl, alt, etc.
    • Then using the current layout and scan code, using MapVirtualKeyEx() will give us a win32 virtual key (UINT type).
    • The ToAsciiEx() function will finally convert the virtual key to 0 - 2 extended ASCII characters (unsigned short) Here's a sample function:

      static int scan2ascii(DWORD scancode, ushort* result)
      static HKL layout=GetKeyboardLayout(0);
      static uchar State[256];

      if (GetKeyboardState(State)==FALSE)
      return 0;
      UINT vk=MapVirtualKeyEx(scancode,1,layout);
      return ToAsciiEx(vk,scancode,State,result,0,layout);

      This returns the number of characters extracted. It will return 0 in the case that there was no conversion, or 1 or 2, depending multibyte character sets, for a valid output.

      In most cases, using char(result[0]) would provide the desired output.

      Report Article
    Sign in to follow this  

    User Feedback

    I've tried this and a very other variations but MapVirtualKeyEx will only return 0 for me. Any help would be amazing.

    Share this comment

    Link to comment
    Share on other sites

    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!

    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!