本帖最后由 aa77dd@163.com 于 2016-10-7 17:05 编辑
获取当前被按下的 按键虚拟键值 组合, 支持全键盘按键, 以及鼠标 左 右 中键
工具用 C 语言编写, 可以用 BASE64 编码包含进 批处理 文件
已测试通过环境: 中文 WIN7 64位
最多可获取同时按下的 4 个按键, 最小的按键虚拟键值放在最低字节, 更大的按键虚拟键值依次放在更高的字节
如果设置了超时参数, 或者以默认超时运行时, 程序将等待直到有任何按键按下 或者 运行时间达到 超时时间 为止
如果在超时前有按键按下, 将返回相应的按键组合值; 否则, 因超时而结束运行, 将返回 255.
例1:
同时按下 A S D F 四个键, 返回值:
0x53464441 = 1397113921 = (83 << 24) + (70 << 16) + (68 << 8) + 65
四个键 的 虚拟键值分别是: A: 65 S: 83 D: 68 F:70
测试程序显示: pressed key value is : 83 + 70 + 68 + 65
例2:
同时按下 右Ctrl 和 N 两个键, 返回值:
0xA34E = 41806 = (163 << 8) + 78
两个键 的 虚拟键值分别是: 右Ctrl: 163 N: 78
测试程序显示: pressed key value is : 0 + 0 + 163 + 78
例3:
按下 右方向键, 返回值:
0x27 = 39
右方向键的虚拟键值是 39
测试程序显示: pressed key value is : 0 + 0 + 0 + 39
测试用批处理程序- @echo off
- setlocal enabledelayedexpansion
-
- REM certutil 在 Windows XP 环境不是原生程序, 需要其他 BASE64 解码器
- certutil -f -decode "%~0" neoGetKey.exe.cab
-
- expand neoGetKey.exe.cab neoGetKey.exe
-
- for /L %%a in () do (
-
- echo;neoGetKey:
-
- neoGetKey.exe 1 X & rem 超时 1ms, 以十六进制显示返回值
-
- REM 其他示例用法
-
- REM neoGetKey.exe 37 & rem 超时 37ms, 不显示返回值
-
- REM neoGetKey.exe 500 D & rem 超时 500ms, 以十进制显示返回值
-
- REM neoGetKey.exe 0 & rem 无限等待直到按键按下, 不显示返回值
-
- REM neoGetKey.exe & rem 无参数运行, 默认超时 1000ms, 并且不显示返回值
-
- REM neoGetKey.exe X & rem 未设定超时参数, 第一个参数会被视为超时参数, 但参数不是数字, 将按默认超时 1000ms 处理, 并且不显示返回值
-
- set "err=!errorlevel!"
- if !err! equ 255 (echo; time out) else (
-
- set /a "k1=err & 0xFF, k2=err>>8 & 0xFF, k3=err>>16 & 0xFF, k4=err>>24 & 0xFF"
- echo; pressed key value is : !k4! + !k3! + !k2! + !k1!
-
- )
-
- echo;pause 3s
- ping -n 2 localhost >nul
-
- )
-
- exit
-
-
- C 源码
-
- neoGetKey.exe
-
- aa77dd@163.com @ 20161007_161916
-
- 获取当前被按下的 按键 值, 支持全键盘按键, 以及鼠标 左 右 中键
-
- 参数说明:
- neoGetKey.exe [timeout [showMethod]]
-
- timeout 超时数, 单位 ms, 在运行超过此时间后自动退出, 并返回 255
- 如果 此项是 0 将一直等到检测到有键按下, 程序才会结束并返回键值.
- 如果 此项不存在, 最长将等到默认值 1000ms 后退出
-
- showMethod 返回值的显示方式, 此项为 D 以十进制显示, 此项为 X 以十六进制显示
- 如果此项不存在, 将不会显示返回值
- 此项 要么不指定, 否则必须和 timeout 同时指定
-
-
-
- ::BEGIN:neoGetKey.C
- #include <Windows.h>
- #include <stdio.h>
-
- int main(int argc, char** argv) {
-
- int i, t = 1000, r = 0, kshift = -8;
- char show[3] = "%\0\0";
-
- if (argc >= 2) t = atoi(argv[1]);
-
- if (argc >= 3)
- show[1] = (**(argv + 2) >= 'a') ? **(argv + 2) : **(argv + 2) + 'a' - 'A';
-
- show[1] = ( show[1] == 'x' || show[1] == 'd') ? show[1] : '\0';
-
- for (i = 0; t == 0 || i < t; i++) {
- int x;
-
- for (x = 1; x <= 0xFE; x++) {
- if (x == VK_SHIFT || x == VK_CONTROL || x == VK_MENU)
- continue;
-
- if (GetAsyncKeyState(x) & 0x8000) {
-
- r |= x << (kshift += 8);
-
- if (kshift >= 24) {
- if (show[1]) printf(show, r);
- return r;
- }
- }
- }
-
- if (r != 0) {
- if (show[1]) printf(show, r);
- return r;
- }
- sleep(1);
-
- }
- if (show[1]) printf(show, 0xFF);
- return 0xFF;
- }
- ::END:neoGetKey.C
-
- ::neoGetKey.exe.cab.b64
- -----BEGIN CERTIFICATE-----
- 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
- -----END CERTIFICATE-----
复制代码 虚拟键值表, 转自微软官方文档 Virtual-Key Codes
https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
Constant/value | Description | VK_LBUTTON
0x01 | Left mouse button | VK_RBUTTON
0x02 | Right mouse button | VK_CANCEL
0x03 | Control-break processing | VK_MBUTTON
0x04 | Middle mouse button (three-button mouse) | VK_XBUTTON1
0x05 | X1 mouse button | VK_XBUTTON2
0x06 | X2 mouse button | -
0x07 | Undefined | VK_BACK
0x08 | BACKSPACE key | VK_TAB
0x09 | TAB key | -
0x0A-0B | Reserved | VK_CLEAR
0x0C | CLEAR key | VK_RETURN
0x0D | ENTER key | -
0x0E-0F | Undefined | VK_SHIFT
0x10 | SHIFT key | VK_CONTROL
0x11 | CTRL key | VK_MENU
0x12 | ALT key | VK_PAUSE
0x13 | PAUSE key | VK_CAPITAL
0x14 | CAPS LOCK key | VK_KANA
0x15 | IME Kana mode | VK_HANGUEL
0x15 | IME Hanguel mode (maintained for compatibility; use VK_HANGUL) | VK_HANGUL
0x15 | IME Hangul mode | -
0x16 | Undefined | VK_JUNJA
0x17 | IME Junja mode | VK_FINAL
0x18 | IME final mode | VK_HANJA
0x19 | IME Hanja mode | VK_KANJI
0x19 | IME Kanji mode | -
0x1A | Undefined | VK_ESCAPE
0x1B | ESC key | VK_CONVERT
0x1C | IME convert | VK_NONCONVERT
0x1D | IME nonconvert | VK_ACCEPT
0x1E | IME accept | VK_MODECHANGE
0x1F | IME mode change request | VK_SPACE
0x20 | SPACEBAR | VK_PRIOR
0x21 | PAGE UP key | VK_NEXT
0x22 | PAGE DOWN key | VK_END
0x23 | END key | VK_HOME
0x24 | HOME key | VK_LEFT
0x25 | LEFT ARROW key | VK_UP
0x26 | UP ARROW key | VK_RIGHT
0x27 | RIGHT ARROW key | VK_DOWN
0x28 | DOWN ARROW key | VK_SELECT
0x29 | SELECT key | VK_PRINT
0x2A | PRINT key | VK_EXECUTE
0x2B | EXECUTE key | VK_SNAPSHOT
0x2C | PRINT SCREEN key | VK_INSERT
0x2D | INS key | VK_DELETE
0x2E | DEL key | VK_HELP
0x2F | HELP key | 0x30 | 0 key | 0x31 | 1 key | 0x32 | 2 key | 0x33 | 3 key | 0x34 | 4 key | 0x35 | 5 key | 0x36 | 6 key | 0x37 | 7 key | 0x38 | 8 key | 0x39 | 9 key | -
0x3A-40 | Undefined | 0x41 | A key | 0x42 | B key | 0x43 | C key | 0x44 | D key | 0x45 | E key | 0x46 | F key | 0x47 | G key | 0x48 | H key | 0x49 | I key | 0x4A | J key | 0x4B | K key | 0x4C | L key | 0x4D | M key | 0x4E | N key | 0x4F | O key | 0x50 | P key | 0x51 | Q key | 0x52 | R key | 0x53 | S key | 0x54 | T key | 0x55 | U key | 0x56 | V key | 0x57 | W key | 0x58 | X key | 0x59 | Y key | 0x5A | Z key | VK_LWIN
0x5B | Left Windows key (Natural keyboard) | VK_RWIN
0x5C | Right Windows key (Natural keyboard) | VK_APPS
0x5D | Applications key (Natural keyboard) | -
0x5E | Reserved | VK_SLEEP
0x5F | Computer Sleep key | VK_NUMPAD0
0x60 | Numeric keypad 0 key | VK_NUMPAD1
0x61 | Numeric keypad 1 key | VK_NUMPAD2
0x62 | Numeric keypad 2 key | VK_NUMPAD3
0x63 | Numeric keypad 3 key | VK_NUMPAD4
0x64 | Numeric keypad 4 key | VK_NUMPAD5
0x65 | Numeric keypad 5 key | VK_NUMPAD6
0x66 | Numeric keypad 6 key | VK_NUMPAD7
0x67 | Numeric keypad 7 key | VK_NUMPAD8
0x68 | Numeric keypad 8 key | VK_NUMPAD9
0x69 | Numeric keypad 9 key | VK_MULTIPLY
0x6A | Multiply key | VK_ADD
0x6B | Add key | VK_SEPARATOR
0x6C | Separator key | VK_SUBTRACT
0x6D | Subtract key | VK_DECIMAL
0x6E | Decimal key | VK_DIVIDE
0x6F | Divide key | VK_F1
0x70 | F1 key | VK_F2
0x71 | F2 key | VK_F3
0x72 | F3 key | VK_F4
0x73 | F4 key | VK_F5
0x74 | F5 key | VK_F6
0x75 | F6 key | VK_F7
0x76 | F7 key | VK_F8
0x77 | F8 key | VK_F9
0x78 | F9 key | VK_F10
0x79 | F10 key | VK_F11
0x7A | F11 key | VK_F12
0x7B | F12 key | VK_F13
0x7C | F13 key | VK_F14
0x7D | F14 key | VK_F15
0x7E | F15 key | VK_F16
0x7F | F16 key | VK_F17
0x80 | F17 key | VK_F18
0x81 | F18 key | VK_F19
0x82 | F19 key | VK_F20
0x83 | F20 key | VK_F21
0x84 | F21 key | VK_F22
0x85 | F22 key | VK_F23
0x86 | F23 key | VK_F24
0x87 | F24 key | -
0x88-8F | Unassigned | VK_NUMLOCK
0x90 | NUM LOCK key | VK_SCROLL
0x91 | SCROLL LOCK key | 0x92-96 | OEM specific | -
0x97-9F | Unassigned | VK_LSHIFT
0xA0 | Left SHIFT key | VK_RSHIFT
0xA1 | Right SHIFT key | VK_LCONTROL
0xA2 | Left CONTROL key | VK_RCONTROL
0xA3 | Right CONTROL key | VK_LMENU
0xA4 | Left MENU key | VK_RMENU
0xA5 | Right MENU key | VK_BROWSER_BACK
0xA6 | Browser Back key | VK_BROWSER_FORWARD
0xA7 | Browser Forward key | VK_BROWSER_REFRESH
0xA8 | Browser Refresh key | VK_BROWSER_STOP
0xA9 | Browser Stop key | VK_BROWSER_SEARCH
0xAA | Browser Search key | VK_BROWSER_FAVORITES
0xAB | Browser Favorites key | VK_BROWSER_HOME
0xAC | Browser Start and Home key | VK_VOLUME_MUTE
0xAD | Volume Mute key | VK_VOLUME_DOWN
0xAE | Volume Down key | VK_VOLUME_UP
0xAF | Volume Up key | VK_MEDIA_NEXT_TRACK
0xB0 | Next Track key | VK_MEDIA_PREV_TRACK
0xB1 | Previous Track key | VK_MEDIA_STOP
0xB2 | Stop Media key | VK_MEDIA_PLAY_PAUSE
0xB3 | Play/Pause Media key | VK_LAUNCH_MAIL
0xB4 | Start Mail key | VK_LAUNCH_MEDIA_SELECT
0xB5 | Select Media key | VK_LAUNCH_APP1
0xB6 | Start Application 1 key | VK_LAUNCH_APP2
0xB7 | Start Application 2 key | -
0xB8-B9 | Reserved | VK_OEM_1
0xBA | Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the ';:' key | VK_OEM_PLUS
0xBB | For any country/region, the '+' key | VK_OEM_COMMA
0xBC | For any country/region, the ',' key | VK_OEM_MINUS
0xBD | For any country/region, the '-' key | VK_OEM_PERIOD
0xBE | For any country/region, the '.' key | VK_OEM_2
0xBF | Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '/?' key | VK_OEM_3
0xC0 | Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '`~' key | -
0xC1-D7 | Reserved | -
0xD8-DA | Unassigned | VK_OEM_4
0xDB | Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '[{' key | VK_OEM_5
0xDC | Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '\|' key | VK_OEM_6
0xDD | Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the ']}' key | VK_OEM_7
0xDE | Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the 'single-quote/double-quote' key | VK_OEM_8
0xDF | Used for miscellaneous characters; it can vary by keyboard. | -
0xE0 | Reserved | 0xE1 | OEM specific | VK_OEM_102
0xE2 | Either the angle bracket key or the backslash key on the RT 102-key keyboard | 0xE3-E4 | OEM specific | VK_PROCESSKEY
0xE5 | IME PROCESS key | 0xE6 | OEM specific | VK_PACKET
0xE7 | Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in | -
0xE8 | Unassigned | 0xE9-F5 | OEM specific | VK_ATTN
0xF6 | Attn key | VK_CRSEL
0xF7 | CrSel key | VK_EXSEL
0xF8 | ExSel key | VK_EREOF
0xF9 | Erase EOF key | VK_PLAY
0xFA | Play key | VK_ZOOM
0xFB | Zoom key | VK_NONAME
0xFC | Reserved | VK_PA1
0xFD | PA1 key | VK_OEM_CLEAR
0xFE | Clear key |
|