Windows 3.1 Device Drivers (ddag31qh.hlp) (Table of Contents; Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software, purely for historical purposes. If you're looking for up-to-date documentation, particularly for programming, you should not rely on the information found here, as it will be woefully out of date.
ToAscii
                                                     Up Next Previous
────────────────────────────────────────────────────────────────────────────
 
int ToAscii(VirtKey, Scancode, lpKeyState, lpState, KeyFlags)
WORD VirtKey;
WORD Scancode;
LPSTR lpKeyState;
LPSTR lpState;
WORD KeyFlags;
 
The ToAscii function translates the virtual-key code passed to it, along
with the current keyboard state, to an ANSI character.
 
Parameter   Description
────────────────────────────────────────────────────────────────────────────
 
 
VirtKey     Specifies a virtual-key code.
 
Scancode    Specifies a hardware-scan code in the low-order byte, and a
            shift state in the high-order byte. The bits in the shift state
            have the following meaning.
 
            Bit  Meaning
            ────────────────────────────────────────────────────────────────
            15   1 if the key is up; 0 if the key is down.
 
            14   1 if the key was previously up; 0 if the key was previously
                 down.
 
            13   1 if the ALT key is down.
 
            12   1 if Windows displays a menu.
 
            11   1 if Windows displays a dialog box.
 
            10   Not used.
 
            9    Not used.
 
            8    1 if the key is extended; 0 if it is not.
 
            Bits 0 through 6 are the hardware-scan code (used mainly in the
            translation of ALT+number-pad character code input). Bit 7 is
            generally 0.
 
lpKeyState  Points to virtual key-state array maintained by Windows.
 
lpState     Points to state block. This is used mainly for the output of
            ANSI characters.
 
KeyFlags    Specifies duplicate shift-state information. The bits have the
            following meaning.
 
            Bit  Meaning
            ────────────────────────────────────────────────────────────────
            0    1 if a menu is display, 0 if not.
 
            1    1 if an extended key, 0 if not.
 
Return Value
 
The return value is the number of characters returned in the state block.
The number of characters, 1 byte per WORD is returned in the AX register.
The lpState parameter points to the state block.
 
The return value is one of the following values.
 
Value  Description
────────────────────────────────────────────────────────────────────────────
2      Two characters are returned (mainly an accent and a dead-key
       character, when a dead key cannot be translated otherwise).
 
1      One ANSI character is returned.
 
0      This virtual-key code has no translation (for the current state of
       shift keys, and so on).
 
-1     This key is a dead key. The character returned is normally an ANSI
       accent character representing the dead key.
 
Comments
 
The export ordinal for this function is 4.
 
The ToAscii function is called mainly whenever TranslateMessage is called to
translate a virtual-key code (for example, for WM_KEYDOWN messages).
 
The given parameters of ToAscii are not necessarily sufficient to translate
the virtual-key code. This is because a previous dead key is stored
internally in the driver. Also, the MS-DOS shift-state byte is accessed by
ToAscii.
 
ToAscii is responsible for maintaining the state of the keyboard LED
indicator lights. For most AT-compatible computers, this is done by making a
ROM BIOS interrupt 16H call; for others, I/O must be done directly through
the keyboard.
 
ToAscii also has a special case which, if it is called with the virtual-key
code equal to 0, will only set the keyboard lights according to the state of
the appropriate entries in the keyboard-state vector. This function is
intended to be called from the SetKeyboardState function and not directly
used by applications. The Scancode parameter is ignored. The vector pointed
to by lpState should be different from the one used by ToAscii calls in the
USER module. The vector should be at least 4 bytes long.
 
Most translations are made on the basis of the Windows virtual-key code.
However, the Scancode parameter's sign bit is used to distinguish key
depressions (sign cleared) from key releases (sign set). Also, the scan code
is used in the translation of ALT + number-key translations.
 
The lpKeyState parameter points to a 256-byte array indexed by the
virtual-key code. In each byte, the high-order bit indicates the state of
the key and the low-order bit is toggled each time the key is pressed. The
CAPSLOCK key is handled in a special manner for some European keyboards.
 
The lpState parameter points to a data buffer that contains the translated
character(s) and state information. The Inquire function in the KBINFO
structure returns the size required for this state buffer.
 
See Also
 
Inquire, KBINFO