
Инженер
   
Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия
Репутация: 19 Всего: 99
|
Ответ на первый вопрос. Есть такая функция под названием GetKeyboardState. Вот что о ней написано в MSDN: Цитата | GetKeyboardState The GetKeyboardState function copies the status of the 256 virtual keys to the specified buffer.
BOOL GetKeyboardState( PBYTE lpKeyState // pointer to array to receive status data ); Parameters lpKeyState Pointer to the 256-byte array that will receive the status data for each virtual key. Return Values If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, callGetLastError.
Remarks An application can call this function to retrieve the current status of all the virtual keys. The status changes as a thread removes keyboard messages from its message queue. The status does not change as keyboard messages are posted to the thread's message queue, nor does it change as keyboard messages are posted to or retrieved from message queues of other threads. (Exception: Threads that are connected viaAttachThreadInput share the same keyboard state.)
When the function returns, each member of the array pointed to by the lpKeyState parameter contains status data for a virtual key. If the high-order bit is 1, the key is down; otherwise, it is up. If the low-order bit is 1, the key is toggled. A key, such as the caps lock key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.
To retrieve status information for an individual key, use the GetKeyState function. To retrieve the current state for an individual key regardless of whether the corresponding keyboard message has been retrieved from the message queue, use the GetAsyncKeyState function
An application can use the virtual-key code constants VK_SHIFT, VK_CONTROL and VK_MENU as indices into the array pointed to by lpKeyState. This gives the status of the shift, ctrl, or alt keys without distinguishing between left and right. An application can also use the following virtual-key code constants as indices to distinguish between the left and right instances of those keys.
VK_LSHIFT VK_RSHIFT VK_LCONTROL VK_RCONTROL VK_LMENU VK_RMENU
These left- and right-distinguishing constants are available to an application only through the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions.
QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Unsupported. Header: Declared in winuser.h. Import Library: Use user32.lib.
See Also Keyboard Input Overview, Keyboard Input Functions, GetKeyState, GetAsyncKeyState, MapVirtualKey, SetKeyboardState |
Таким образом тебе надо сделать что-то по типа: Код | Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Const VK_CAPITAL = &H14
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Dim keys(0 To 255) As Byte Dim CapsLockState As Boolean GetKeyboardState keys(0) CapsLockState = keys(VK_CAPITAL) ' нажат ли shift ...
|
или например для того чтобы узнать нажаты ли одновременно циферки 0 и 1: Код | Option Explicit
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Const VK_0 = &H30 Const VK_1 = &H31
Private Sub Form_KeyPress(KeyAscii As Integer) Dim keys(0 To 255) As Byte Dim CapsLockState As Boolean GetKeyboardState keys(0) If (keys(VK_0) And keys(VK_1)) Then MsgBox "Вот они!" End Sub |
Ну а вот тебе значения констант из того же MSDN: Цитата | Virtual-Key Codes Introduction The virtual-key codes provide a hardware- and language-independent method of identifying keyboard keys. Each virtual-key code represents a unique keyboard key and also identifies the purpose of that key. The keyboard driver must provide one or more keyboard layouts that maps keyboard scan codes to the appropriate virtual-key codes.
Required Virtual Keys The complete virtual-key code set consists of 256 byte values in the range 0 to 255. Most, but not all, of the values used by standard drivers are in the range 0 to 127. There is a loose distinction between "standard" keys, which do not vary much, and "OEM" keys, which do vary from keyboard to keyboard.
For full Windows functionality, a keyboard driver must provide the following virtual keys:
Virtual-key code Description VK_0 through VK_9 Number keys (not on numeric keypad): 0 through 9 VK_A through VK_Z Letter keys: A through Z VK_BACK BACKSPACE key VK_CONTROL CTRL key VK_DELETE DELETE key VK_DOWN Down direction key VK_END END key VK_ESCAPE ESC key VK_F1 through VK_F10 F1 through F10 keys VK_HOME HOME key VK_INSERT INSERT key VK_LEFT Left direction key VK_MENU ALT key VK_NEXT PAGE DOWN key VK_PRIOR PAGE UP key VK_RIGHT Right direction key VK_SHIFT Left and right SHIFT keys VK_SNAPSHOT PRINTSCREEN key VK_SPACE SPACE key VK_TAB TAB key VK_UP Up direction key Shift keys must be available in the combinations unshifted, SHIFT, CTRL, and CTRL+ALT.
Most keyboards, the virtual-key codes VK_INSERT, VK_DELETE, VK_HOME, VK_END, VK_PRIOR, and VK_NEXT are generated on the numeric keypad only if NUMLOCK is off.
Optional Virtual Keys If a keyboard has a numeric pad, the numeric keys are frequently used as cursor-control and editing keys if NUMLOCK is off. If NUMLOCK is on, the virtual-key codes VK_NUMPAD0 through VK_NUMPAD9 are used for the digits. Keyboards with a DELETE key that also generates the decimal point (period or comma) use VK_DELETE and VK_DECIMAL to distinguish between the two uses of the key.
Keyboards commonly contain various "lock" keys, such as VK_CAPITAL and VK_NUMLOCK. If a keyboard driver generates ANSI characters on the numeric keypad using ALT + numeric-pad keys, it must do this translation only if NUMLOCK is on. The cursor and editing keys on IBM-compatible keyboards do not produce this translation.
Other keys may vary from keyboard to keyboard. The following set of virtual-key codes is generally used for punctuation keys, accented letter keys, and dead keys in the main section of a keyboard:
VK_OEM_1 ... VK_OEM_8
VK_OEM_102
VK_OEM_PLUS, VK_OEM_MINUS, VK_OEM_COMMA, VK_OEM_PERIOD
If a keyboard has more than 16 function keys, the virtual-key codes in the range VK_F17 through VK_F24 should be used for the extra function keys.
Windows internally generates the mouse-button virtual-key codes VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, and VK_CANCEL. These virtual-key codes are generated internally by Windows and are never generated by keyboard or mouse drivers.
Keyboard drivers should not generate VK_EXECUTE or VK_SEPARATER.
Virtual Keys for 122-Key Keyboards For keyboards with 122 keys, the mapping for the first 101 keys is the same as described in previous sections.
The function keys F13 through F24 should use VK_F13 through VK_F24.
The remaining keys should be mapped to the following virtual-key codes:
VK_ATTN VK_OEM_CLEAR VK_CRSEL VK_PA1 VK_EREOF VK_PLAY VK_EXSEL VK_ZOOM VK_NONAME
Virtual-Key Code Definitions The following table includes the virtual-key codes that are defined for Windows. The key code values 0 and 0FFh are not used.
Virtual-key Codes Name Value Comment VK_LBUTTON 01h Left mouse button. VK_RBUTTON 02h Right mouse button. VK_CANCEL 03h Used for control-break processing. VK_MBUTTON 04h Middle mouse button (3-button mouse).
05h through 07h undefined. VK_BACK 08h VK_TAB 09h
0Ah and 0Bh undefined. VK_CLEAR 0Ch VK_RETURN 0Dh
0Eh and 0Fh undefined. VK_SHIFT 10h VK_CONTROL 11h VK_MENU 12h VK_PAUSE 13h VK_CAPITAL 14h
15h through 1Ah undefined. VK_ESCAPE 1Bh
1Ch through 1Fh undefined. VK_SPACE 20h VK_PRIOR 21h Page up. VK_NEXT 22h Page down. VK_END 23h VK_HOME 24h VK_LEFT 25h VK_UP 26h VK_RIGHT 27h VK_DOWN 28h VK_SELECT 29h VK_PRINT 2Ah Only used by Nokia. VK_EXECUTE 2Bh Never used. VK_SNAPSHOT 2Ch SYSREQ key starting with Windows 3.0. VK_INSERT 2Dh VK_DELETE 2Eh VK_HELP 2Fh VK_0 30h VK_1 31h VK_2 32h VK_3 33h VK_4 34h VK_5 35h VK_6 36h VK_7 37h VK_8 38h VK_9 39h
3Ah though 40h undefined. VK_A 41h VK_B 42h VK_C 43h VK_D 44h VK_E 45h VK_F 46h VK_G 47h VK_H 48h VK_I 49h VK_J 4Ah VK_K 4Bh VK_L 4Ch VK_M 4Dh VK_N 4Eh VK_O 4Fh VK_P 50h VK_Q 51h VK_R 52h VK_S 53h VK_T 54h VK_U 55h VK_V 56h VK_W 57h VK_X 58h VK_Y 59h VK_Z 5Ah
5Bh through 5Fh undefined. VK_NUMPAD0 60h VK_NUMPAD1 61h VK_NUMPAD2 62h VK_NUMPAD3 63h VK_NUMPAD4 64h VK_NUMPAD5 65h VK_NUMPAD6 66h VK_NUMPAD7 67h VK_NUMPAD8 68h VK_NUMPAD9 69h VK_MULTIPLY 6Ah VK_ADD 6Bh VK_SEPARATER 6Ch Never generated by keyboard driver. VK_SUBTRACT 6Dh VK_DECIMAL 6Eh VK_DIVIDE 6Fh VK_F1 70h VK_F2 71h VK_F3 72h VK_F4 73h VK_F5 74h VK_F6 75h VK_F7 76h VK_F8 77h VK_F9 78h VK_F10 79h VK_F11 7Ah VK_F12 7Bh VK_F13 7Ch VK_F14 7Dh VK_F15 7Eh VK_F16 7Fh VK_F17 80h VK_F18 81h VK_F19 82h VK_F20 83h VK_F21 84h VK_F22 85h VK_F23 86h VK_F24 87h
88h through 8Fh unassigned. VK_NUMLOCK 090h NUMLOCK on all keyboards. VK_OEM_SCROLL 091h SCROLL LOCK on all keyboards.
92h through B9h unassigned. VK_OEM_1 0BAh Punctuation. VK_OEM_PLUS 0BBh Punctuation. VK_OEM_COMMA 0BCh Punctuation. VK_OEM_MINUS 0BDh Punctuation. VK_OEM_PERIOD 0BEh Punctuation. VK_OEM_2 0BFh Punctuation. VK_OEM_3 0C0h Punctuation.
C1h through DAh unassigned. VK_OEM_4 0DBh Punctuation. VK_OEM_5 0DCh Punctuation. VK_OEM_6 0DDh Punctuation. VK_OEM_7 0DEh Punctuation. VK_OEM_8 0DFh Punctuation. VK_F17 0E0h F17 key on Olivetti extended keyboard (internal use only). VK_F18 0E1h F18 key on Olivetti extended keyboard (internal use only). VK_OEM_102 0E2h < or | on IBM-compatible 102 enhanced keyboard (non-U.S.). VK_ICO_HELP 0E3h Help key on Olivetti extended keyboard (internal use only). VK_ICO_00 0E4h 00 key on Olivetti extended keyboard (internal use only).
E5h unassigned. VK_ICO_CLEAR 0E6h Olivetti extended keyboard (internal use only).
E7h and E8h unassigned. VK_OEM_RESET 0E9H Only used by Nokia. VK_OEM_JUMP 0EAH Only used by Nokia. VK_OEM_PA1 0EBH Only used by Nokia. VK_OEM_PA2 0ECH Only used by Nokia. VK_OEM_PA3 0EDH Only used by Nokia. VK_OEM_WSCTRL 0EEH Only used by Nokia. VK_OEM_CUSEL 0EFH Only used by Nokia. VK_OEM_ATTN 0F0H Only used by Nokia. VK_OEM_FINNISH 0F1H Only used by Nokia. VK_OEM_COPY 0F2H Only used by Nokia. VK_OEM_AUTO 0F3H Only used by Nokia. VK_OEM_ENLW 0F4h Only used by Nokia. VK_OEM_BACKTAB 0F5h Only used by Nokia. VK_ATTN 0F6H VK_CRSEL 0F7H VK_EXSEL 0F8H VK_EREOF 0F9H VK_PLAY 0FAH VK_ZOOM 0FBH VK_NONAME 0FCH VK_PA1 0FDH VK_OEM_CLEAR 0FEH |
Ух скока понаписал - надо бы в FAQ засунуть.
|