{ This file is part of the Free Pascal run time library. Copyright (c) 2008 Free Pascal development team. See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ********************************************************************** } // // Module: keybd.h // // Non Win32 defines and structs for WinCE keyboard. // // // Microsoft Windows Mobile 6.0 for PocketPC SDK. // unit keybd; interface uses windows, WinIOCtl; // EXTERNAL DRIVERS // KEY_STATE_FLAGS | Flags for keyboard events and shift state. { These flags perform a number of functions: The low order bits are used to keep track of a key state. This allows using 256 UINT8's for the key state array just like Windows does already. The upper bits keep track of shift state on a per key basis. Since we are not maintaining a complete key state array for each task, this gives us some extra info without a big memory penalty. The KeyStateDownFlag does double duty internal to the driver to identify key up or key down events. KeyShiftDeadFlag is set by the function to signify that the character generated is a dead character. KeyShiftNoCharacterFlag is set by the function to signify that there is no valid character to generate for the given virtual key event. This may be the case on a key up event or a key which only changes the shift state. The control, alt, shift and capital flags are set by the function to encapsulate the shift state when the character was generated. KeybdDriverVKeyToUnicode KeybdEventCallback } type KEY_STATE_FLAGS = UINT32; const KeyStateToggledFlag = $0001; // Key is toggled. KeyStateGetAsyncDownFlag = $0002; // Key went down since last GetAsyncKey call. KeyStateReserved4 = $0004; KeyStateReserved8 = $0008; KeyStateReserved10 = $0010; KeyStateReserved20 = $0020; KeyStatePrevDownFlag = $0040; // Key was previously down. KeyStateDownFlag = $0080; // Key is currently down. KeyStateKeyEventFlag = $80000000; // Internal KeyShiftAnyCtrlFlag = $40000000; // L or R control is down. KeyShiftAnyShiftFlag = $20000000; // L or R shift is down. KeyShiftAnyAltFlag = $10000000; // L or R alt is down. KeyShiftCapitalFlag = $08000000; // VK_CAPITAL is toggled. KeyShiftLeftCtrlFlag = $04000000; // L control is down. KeyShiftLeftShiftFlag = $02000000; // L shift is down. KeyShiftLeftAltFlag = $01000000; // L alt is down. KeyShiftLeftWinFlag = $00800000; // L Win key is down. KeyShiftRightCtrlFlag = $00400000; // R control is down. KeyShiftRightShiftFlag = $00200000; // R shift is down. KeyShiftRightAltFlag = $00100000; // R alt is down. KeyShiftRightWinFlag = $00080000; // R Win key is down. KeyShiftReserved40000 = $00040000; // Reserved. KeyShiftDeadFlag = $00020000; // Corresponding char is dead char. KeyShiftNoCharacterFlag = $00010000; // No corresponding char. KeyShiftLanguageFlag1 = $00008000; // Use for language specific shifts. KeyShiftKeybdEventFlag = $00004000; // Not for external use. KeyShiftUseVKNullFlag = $00002000; // Not for external use. KeyShiftNumLockFlag = $00001000; // NumLock toggled state. KeyShiftScrollLockFlag = $00000800; // ScrollLock toggled state. KeyShiftReserved400 = $00000400; // Reserved. KeyShiftReserved200 = $00000200; // Reserved. KeyShiftReserved100 = $00000100; // Reserved. // Japanese keyboard KeyShiftKanaFlag = KeyShiftLanguageFlag1; // Kana lock is toggled. function KeyStateIsDown(Flags:KEY_STATE_FLAGS):BOOL; function KeyStateIsPrevDown(Flags:KEY_STATE_FLAGS):BOOL; function KeyStateIsToggled(Flags:KEY_STATE_FLAGS):BOOL; function KeyStateIsDownTransition(Flags:KEY_STATE_FLAGS):BOOL; const COUNT_VKEYS = 256; { EXTERNAL DRIVERS KEY_STATE | Array of virtual key states. } type KEY_STATE = array[0..COUNT_VKEYS-1] of UINT8; // // KeyboardDriverGetDeviceInfo query capability definitions // // EXTERNAL DRIVERS // ULONG | KBDI_VKEY_TO_UNICODE_INFO_ID | // Id for KeybdDriverGetInfo to get Unicode conversion info. // // xref // KeybdDriverGetInfo // KBDI_VKEY_TO_UNICODE_INFO // KeybdDriverVKeyToUnicode const KBDI_VKEY_TO_UNICODE_INFO_ID = 0; // EXTERNAL DRIVERS KEYBD_DRIVER // KBDI_VKEY_TO_UNICODE_INFO // Info required to set up for Unicode conversion. // // xref // KeybdDriverGetInfo // KBDI_VKEY_TO_UNICODE_INFO_ID // KeybdDriverVKeyToUnicode // TO_UNICODE_STATE { cbToUnicodeState is the number of bytes necessary to store the driver specific state which is required to generate characters from a virtual key. For example, a French keyboard driver may need to remember that an accent key was previously pressed in order to decide on a specific Unicode character to generate for a virtual key. This value may be 0 if no other state besides is required to generate characters, e.g., English keyboard drivers. cMaxToUnicodeCharacters is the maximum number of characters that may be generated by a call to KeybdDriverVKeyToUnicode. For example, if a user presses the '^' key and then the 'b' key, a French keyboard driver would generate the two characters, '^' 'b', when the second key is pressed. Note that this is not the count of bytes required to store the characters, it is just the number of characters. } type KBDI_VKEY_TO_UNICODE_INFO = record cbToUnicodeState:UINT32; // @FIELD Count of bytes required // for state info for Unicode // character generation. cMaxToUnicodeCharacters:UINT32; // @FIELD Maximum number of characters // generated for a single virtual key. end; // EXTERNAL DRIVERS // ULONG | KBDI_AUTOREPEAT_INFO_ID // Id for KeybdDriverGetInfo to get keyboard auto-repeat info. // // xref // KeybdDriverGetInfo // KBDI_AUTOREPEAT_INFO // KBDI_AUTOREPEAT_SELECTIONS_INFO_ID const KBDI_AUTOREPEAT_INFO_ID = 1; // Info about the keyboard autorepeat capabilities and settings. { cInitialDelaysSelectable gives the number of initial delays which may be set. Query again using to get the actual values available. cRepeatRatesSelectable is similar to cInitialDelaysSelectable except that it gives the number of repeat rates available. } type KBDI_AUTOREPEAT_INFO = record CurrentInitialDelay:INT32; // @FIELD Current initial delay in milliseconds. CurrentRepeatRate:INT32; // @FIELD Current repeat rate in keys per second. cInitialDelaysSelectable:INT32; // @FIELD Number of initial delays selectable. cRepeatRatesSelectable:INT32; // @FIELD Number of repeat rates supported. end; const KBD_AUTO_REPEAT_INITIAL_DELAY_DEFAULT = 500; KBD_AUTO_REPEAT_INITIAL_DELAY_MIN = 250; KBD_AUTO_REPEAT_INITIAL_DELAY_MAX = 1000; KBD_AUTO_REPEAT_KEYS_PER_SEC_DEFAULT = 20; KBD_AUTO_REPEAT_KEYS_PER_SEC_MIN = 2; KBD_AUTO_REPEAT_KEYS_PER_SEC_MAX = 30; // Id for KeybdDriverGetInfo to get keyboard auto-repeat selections info. { When KeybdDriverGetInfo is called with this value, the lpOutput parameter should be a pointer to an array of INT32's to hold the selection info. The initial delays will be put at the beginning of the array followed by the repeat rate selections. The number of initial delay values is determined by calling using and looking at the returned cInitialDelaysSelectable field. If this value is -1, there will be two (2) values, the min and max and the initial delay may be set to any value in this range. This value may be 0 if the initial delay is not settable. Similarly, if cRepeatRatesSelectable is 0, there will be no repeat rate information. If it is -1, there will be two (2) values, the min and max. Initial delay values are in milliseconds. Repeat rates are in keys per second. } const KBDI_AUTOREPEAT_SELECTIONS_INFO_ID = 2; // INTERNATIONAL const KBDI_KEYBOARD_STATUS_ID = 3; const KBDI_KEYBOARD_PRESENT = $0001; KBDI_KEYBOARD_ENABLED = $0002; KBDI_KEYBOARD_ENTER_ESC = $0004; KBDI_KEYBOARD_ALPHA_NUM = $0008; // Reserve for SHIME_MODE. // Pass in the SHIME_MODE as the input parameter. const KBDI_SHIME_MODE_ID = 4; KBDI_SHIME_MODE_NONE = $0000; KBDI_SHIME_MODE_SPELL = $0001; KBDI_SHIME_MODE_SPELL_CAPS = $0002; KBDI_SHIME_MODE_SPELL_CAPS_LOCK = $0003; KBDI_SHIME_MODE_AMBIGUOUS = $0004; KBDI_SHIME_MODE_AMBIGUOUS_CAPS = $0005; KBDI_SHIME_MODE_AMBIGUOUS_CAPS_LOCK = $0006; KBDI_SHIME_MODE_NUMBERS = $0007; KBDI_SHIME_MODE_CUSTOM = $0008; // External keyboard interface const DEVCLASS_KEYBOARD_STRING = '{CBE6DDF2-F5D4-4E16-9F61-4CCC0B6695F3}'; DEVCLASS_KEYBOARD_GUID:System.TGUID = (D1: $CBE6DDF2; D2: $F5D4; D3: $4E16; D4: ($9F, $61, $4C, $CC, $0B, $66, $95, $F3)); // DEVCLASS_KEYBOARD_GUID:System.TGUID = '{CBE6DDF2-F5D4-4E16-9F61-4CCC0B6695F3}'; // Pass in the KEY_STATE_FLAGS as the input parameter. const IOCTL_KBD_SET_MODIFIERS = (FILE_DEVICE_KEYBOARD shl 16) or (1 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14); IOCTL_HID_SET_MODIFIERS = IOCTL_KBD_SET_MODIFIERS; // Pass in the KBDI_AUTOREPEAT_INFO as the input parameter. const IOCTL_KBD_SET_AUTOREPEAT = (FILE_DEVICE_KEYBOARD shl 16) or (2 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14); IOCTL_HID_SET_AUTOREPEAT = IOCTL_KBD_SET_AUTOREPEAT; // Pass in the Input Language's fLocaleFlags as the input parameter. const IOCTL_KBD_SET_LOCALE_FLAGS = (FILE_DEVICE_KEYBOARD shl 16) or (3 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14); implementation function KeyStateIsDown(Flags:KEY_STATE_FLAGS):BOOL; inline; begin KeyStateIsDown:=(Flags and KeyStateDownFlag)<>0; end; function KeyStateIsPrevDown(Flags:KEY_STATE_FLAGS):BOOL; inline; begin KeyStateIsPrevDown:=(Flags and KeyStatePrevDownFlag)<>0; end; function KeyStateIsToggled(Flags:KEY_STATE_FLAGS):BOOL; inline; begin KeyStateIsToggled:=(Flags and KeyStateToggledFlag)<>0; end; function KeyStateIsDownTransition(Flags:KEY_STATE_FLAGS):BOOL; inline; begin KeyStateIsDownTransition:=KeyStateIsDown(Flags) and (not KeyStateIsPrevDown(Flags)); end; end.