| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- {
- 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 <f KeybdDriverVKeyToUnicode> function
- to signify that the character generated is a dead character.
- KeyShiftNoCharacterFlag is set by the <f KeybdDriverVKeyToUnicode>
- 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 <f
- KeybdDriverVKeyToUnicode> 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 <t KEY_STATE> 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 <c KBDI_AUTOREPEAT_SELECTIONS_INFO_ID> 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 <f KeybdDriverGetInfo> using <c
- KBDI_AUTOREPEAT_INFO_ID> 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.
|