toy_arms/
keyboard.rs

1#[doc(hidden)]
2pub use winapi::um::winuser::GetAsyncKeyState;
3
4/// detect_keydown! returns true if the passed keys are both pressed. You can specify as many keys as you crave.
5/// * `$keycode` - VirtualKeycode you want to detect that's being pressed.
6/// #Example
7/// ```rust
8/// if detect_keydown!(VirtualKeyCode::VK_INSERT, VirtualKeyCode::VK_HOME) {
9///     println!("INSERT and HOME is both pressed down");
10/// }
11/// ```
12#[macro_export]
13macro_rules! detect_keydown {
14    ($($keycode:expr),*) => {
15            if true $(&& (|keycode| unsafe { $crate::GetAsyncKeyState(keycode) })($keycode) & 0x8000 != 0 )* {
16                true
17            } else {
18                false
19            }
20    };
21}
22
23/// detect_keydown returns true when you pressed the specified key.
24/// However, the "key press" signal will be emitted several times when you press and hold a key.
25/// Make sure you release your finger immediately after pressing a key just in case so that this function catches key press only once.
26/// # Example
27/// ```rust
28/// use toy_arms::VirtualKeyCode;
29/// if toy_arms::detect_keypress(VirtualKeyCode::VK_HOME) {
30///     println!("HOME key is pressed!");
31/// }
32/// ```
33pub fn detect_keypress(code: i32) -> bool {
34    unsafe { GetAsyncKeyState(code) & 1 != 0 }
35}
36
37/// VirtualKeyCode is a set of virtual key code defined by microsoft.
38/// document is [here](https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes)
39pub struct VirtualKeyCode;
40impl VirtualKeyCode {
41    pub const VK_LBUTTON: i32 = 0x01;
42    pub const VK_RBUTTON: i32 = 0x02;
43    pub const VK_CANCEL: i32 = 0x03;
44    pub const VK_MBUTTON: i32 = 0x04;
45    pub const VK_XBUTTON1: i32 = 0x05;
46    pub const VK_XBUTTON2: i32 = 0x06;
47    pub const VK_BACK: i32 = 0x08;
48    pub const VK_TAB: i32 = 0x09;
49    pub const VK_CLEAR: i32 = 0x0C;
50    pub const VK_RETURN: i32 = 0x0D;
51    pub const VK_SHIFT: i32 = 0x10;
52    pub const VK_CONTROL: i32 = 0x11;
53    pub const VK_MENU: i32 = 0x12;
54    pub const VK_PAUSE: i32 = 0x13;
55    pub const VK_CAPITAL: i32 = 0x14;
56    pub const VK_KANA: i32 = 0x15;
57    pub const VK_HANGUEL: i32 = 0x15;
58    pub const VK_HANGUL: i32 = 0x15;
59    pub const VK_IME_ON: i32 = 0x16;
60    pub const VK_JUNJA: i32 = 0x17;
61    pub const VK_FINAL: i32 = 0x18;
62    pub const VK_HANJA: i32 = 0x19;
63    pub const VK_KANJI: i32 = 0x19;
64    pub const VK_IME_OFF: i32 = 0x1A;
65    pub const VK_ESCAPE: i32 = 0x1B;
66    pub const VK_CONVERT: i32 = 0x1C;
67    pub const VK_NONCONVERT: i32 = 0x1D;
68    pub const VK_ACCEPT: i32 = 0x1E;
69    pub const VK_MODECHANGE: i32 = 0x1F;
70    pub const VK_SPACE: i32 = 0x20;
71    pub const VK_PRIOR: i32 = 0x21;
72    pub const VK_NEXT: i32 = 0x22;
73    pub const VK_END: i32 = 0x23;
74    pub const VK_HOME: i32 = 0x24;
75    pub const VK_LEFT: i32 = 0x25;
76    pub const VK_UP: i32 = 0x26;
77    pub const VK_RIGHT: i32 = 0x27;
78    pub const VK_DOWN: i32 = 0x28;
79    pub const VK_SELECT: i32 = 0x29;
80    pub const VK_PRINT: i32 = 0x2A;
81    pub const VK_EXECUTE: i32 = 0x2B;
82    pub const VK_SNAPSHOT: i32 = 0x2C;
83    pub const VK_INSERT: i32 = 0x2D;
84    pub const VK_DELETE: i32 = 0x2E;
85    pub const VK_HELP: i32 = 0x2F;
86    pub const VK_0: i32 = 0x30;
87    pub const VK_1: i32 = 0x31;
88    pub const VK_2: i32 = 0x32;
89    pub const VK_3: i32 = 0x33;
90    pub const VK_4: i32 = 0x34;
91    pub const VK_5: i32 = 0x35;
92    pub const VK_6: i32 = 0x36;
93    pub const VK_7: i32 = 0x37;
94    pub const VK_8: i32 = 0x38;
95    pub const VK_9: i32 = 0x39;
96    pub const VK_A: i32 = 0x41;
97    pub const VK_B: i32 = 0x42;
98    pub const VK_C: i32 = 0x43;
99    pub const VK_D: i32 = 0x44;
100    pub const VK_E: i32 = 0x45;
101    pub const VK_F: i32 = 0x46;
102    pub const VK_G: i32 = 0x47;
103    pub const VK_H: i32 = 0x48;
104    pub const VK_I: i32 = 0x49;
105    pub const VK_J: i32 = 0x4A;
106    pub const VK_K: i32 = 0x4B;
107    pub const VK_L: i32 = 0x4C;
108    pub const VK_M: i32 = 0x4D;
109    pub const VK_N: i32 = 0x4E;
110    pub const VK_O: i32 = 0x4F;
111    pub const VK_P: i32 = 0x50;
112    pub const VK_Q: i32 = 0x51;
113    pub const VK_R: i32 = 0x52;
114    pub const VK_S: i32 = 0x53;
115    pub const VK_T: i32 = 0x54;
116    pub const VK_U: i32 = 0x55;
117    pub const VK_V: i32 = 0x56;
118    pub const VK_W: i32 = 0x57;
119    pub const VK_X: i32 = 0x58;
120    pub const VK_Y: i32 = 0x59;
121    pub const VK_Z: i32 = 0x5A;
122    pub const VK_LWIN: i32 = 0x5B;
123    pub const VK_RWIN: i32 = 0x5C;
124    pub const VK_APPS: i32 = 0x5D;
125    pub const VK_SLEEP: i32 = 0x5F;
126    pub const VK_NUMPAD0: i32 = 0x60;
127    pub const VK_NUMPAD1: i32 = 0x61;
128    pub const VK_NUMPAD2: i32 = 0x62;
129    pub const VK_NUMPAD3: i32 = 0x63;
130    pub const VK_NUMPAD4: i32 = 0x64;
131    pub const VK_NUMPAD5: i32 = 0x65;
132    pub const VK_NUMPAD6: i32 = 0x66;
133    pub const VK_NUMPAD7: i32 = 0x67;
134    pub const VK_NUMPAD8: i32 = 0x68;
135    pub const VK_NUMPAD9: i32 = 0x69;
136    pub const VK_MULTIPLY: i32 = 0x6A;
137    pub const VK_ADD: i32 = 0x6B;
138    pub const VK_SEPARATOR: i32 = 0x6C;
139    pub const VK_SUBTRACT: i32 = 0x6D;
140    pub const VK_DECIMAL: i32 = 0x6E;
141    pub const VK_DIVIDE: i32 = 0x6F;
142    pub const VK_F1: i32 = 0x70;
143    pub const VK_F2: i32 = 0x71;
144    pub const VK_F3: i32 = 0x72;
145    pub const VK_F4: i32 = 0x73;
146    pub const VK_F5: i32 = 0x74;
147    pub const VK_F6: i32 = 0x75;
148    pub const VK_F7: i32 = 0x76;
149    pub const VK_F8: i32 = 0x77;
150    pub const VK_F9: i32 = 0x78;
151    pub const VK_F10: i32 = 0x79;
152    pub const VK_F11: i32 = 0x7A;
153    pub const VK_F12: i32 = 0x7B;
154    pub const VK_F13: i32 = 0x7C;
155    pub const VK_F14: i32 = 0x7D;
156    pub const VK_F15: i32 = 0x7E;
157    pub const VK_F16: i32 = 0x7F;
158    pub const VK_F17: i32 = 0x80;
159    pub const VK_F18: i32 = 0x81;
160    pub const VK_F19: i32 = 0x82;
161    pub const VK_F20: i32 = 0x83;
162    pub const VK_F21: i32 = 0x84;
163    pub const VK_F22: i32 = 0x85;
164    pub const VK_F23: i32 = 0x86;
165    pub const VK_F24: i32 = 0x87;
166    pub const VK_NUMLOCK: i32 = 0x90;
167    pub const VK_SCROLL: i32 = 0x91;
168    pub const VK_LSHIFT: i32 = 0xA0;
169    pub const VK_RSHIFT: i32 = 0xA1;
170    pub const VK_LCONTROL: i32 = 0xA2;
171    pub const VK_RCONTROL: i32 = 0xA3;
172    pub const VK_LMENU: i32 = 0xA4;
173    pub const VK_RMENU: i32 = 0xA5;
174    pub const VK_BROWSER_BACK: i32 = 0xA6;
175    pub const VK_BROWSER_FORWARD: i32 = 0xA7;
176    pub const VK_BROWSER_REFRESH: i32 = 0xA8;
177    pub const VK_BROWSER_STOP: i32 = 0xA9;
178    pub const VK_BROWSER_SEARCH: i32 = 0xAA;
179    pub const VK_BROWSER_FAVORITES: i32 = 0xAB;
180    pub const VK_BROWSER_HOME: i32 = 0xAC;
181    pub const VK_VOLUME_MUTE: i32 = 0xAD;
182    pub const VK_VOLUME_DOWN: i32 = 0xAE;
183    pub const VK_VOLUME_UP: i32 = 0xAF;
184    pub const VK_MEDIA_NEXT_TRACK: i32 = 0xB0;
185    pub const VK_MEDIA_PREV_TRACK: i32 = 0xB1;
186    pub const VK_MEDIA_STOP: i32 = 0xB2;
187    pub const VK_MEDIA_PLAY_PAUSE: i32 = 0xB3;
188    pub const VK_LAUNCH_MAIL: i32 = 0xB4;
189    pub const VK_LAUNCH_MEDIA_SELECT: i32 = 0xB5;
190    pub const VK_LAUNCH_APP1: i32 = 0xB6;
191    pub const VK_LAUNCH_APP2: i32 = 0xB7;
192    pub const VK_OEM_1: i32 = 0xBA;
193    pub const VK_OEM_PLUS: i32 = 0xBB;
194    pub const VK_OEM_COMMA: i32 = 0xBC;
195    pub const VK_OEM_MINUS: i32 = 0xBD;
196    pub const VK_OEM_PERIOD: i32 = 0xBE;
197    pub const VK_OEM_2: i32 = 0xBF;
198    pub const VK_OEM_3: i32 = 0xC0;
199    pub const VK_OEM_4: i32 = 0xDB;
200    pub const VK_OEM_5: i32 = 0xDC;
201    pub const VK_OEM_6: i32 = 0xDD;
202    pub const VK_OEM_7: i32 = 0xDE;
203    pub const VK_OEM_8: i32 = 0xDF;
204    pub const VK_OEM_102: i32 = 0xE2;
205    pub const VK_PROCESSKEY: i32 = 0xE5;
206    pub const VK_PACKET: i32 = 0xE7;
207    pub const VK_ATTN: i32 = 0xF6;
208    pub const VK_CRSEL: i32 = 0xF7;
209    pub const VK_EXSEL: i32 = 0xF8;
210    pub const VK_EREOF: i32 = 0xF9;
211    pub const VK_PLAY: i32 = 0xFA;
212    pub const VK_ZOOM: i32 = 0xFB;
213    pub const VK_NONAME: i32 = 0xFC;
214    pub const VK_PA1: i32 = 0xFD;
215    pub const VK_OEM_CLEAR: i32 = 0xFE;
216}