44
55#include <ctype.h> /* For isupper() */
66
7- /* Convenience wrappers around ugly APIs. */
8- #define WIN32_KEY_EVENT_WAIT (key , flags ) \
9- (win32KeyEvent(key, flags), Sleep(DEADBEEF_RANDRANGE(0, 63)))
10-
117void win32KeyEvent (int key , MMKeyFlags flags )
128{
9+ UINT scan = MapVirtualKey (key & 0xff , MAPVK_VK_TO_VSC );
10+
1311 /* Set the scan code for extended keys */
1412 switch (key )
1513 {
@@ -53,9 +51,11 @@ void win32KeyEvent(int key, MMKeyFlags flags)
5351
5452 INPUT keyboardInput ;
5553 keyboardInput .type = INPUT_KEYBOARD ;
54+ keyboardInput .ki .wScan = (WORD )scan ;
5655 keyboardInput .ki .wVk = (WORD )key ;
57- keyboardInput .ki .dwFlags = flags ;
58- SendInput (1 , & keyboardInput , sizeof (INPUT ));
56+ keyboardInput .ki .dwFlags = KEYEVENTF_SCANCODE | flags ;
57+ keyboardInput .ki .time = 0 ;
58+ SendInput (1 , & keyboardInput , sizeof (keyboardInput ));
5959}
6060
6161void toggleKeyCode (MMKeyCode code , const bool down , MMKeyFlags flags )
@@ -66,19 +66,19 @@ void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags)
6666 {
6767 /* Parse modifier keys. */
6868 if (flags & MOD_META )
69- WIN32_KEY_EVENT_WAIT (K_META , dwFlags );
69+ win32KeyEvent (K_META , dwFlags );
7070 if (flags & MOD_ALT )
71- WIN32_KEY_EVENT_WAIT (K_ALT , dwFlags );
71+ win32KeyEvent (K_ALT , dwFlags );
7272 if (flags & MOD_CONTROL )
73- WIN32_KEY_EVENT_WAIT (K_CONTROL , dwFlags );
73+ win32KeyEvent (K_CONTROL , dwFlags );
7474 if (flags & MOD_SHIFT )
75- WIN32_KEY_EVENT_WAIT (K_SHIFT , dwFlags );
75+ win32KeyEvent (K_SHIFT , dwFlags );
7676
77- WIN32_KEY_EVENT_WAIT (code , dwFlags );
77+ win32KeyEvent (code , dwFlags );
7878 }
7979 else
8080 {
81- WIN32_KEY_EVENT_WAIT (code , dwFlags );
81+ win32KeyEvent (code , dwFlags );
8282
8383 /* Parse modifier keys. */
8484 if (flags & MOD_META )
0 commit comments