1 /**
2  * Windows input utility code.
3  *
4  * License:
5  *   This Source Code Form is subject to the terms of
6  *   the Mozilla Public License, v. 2.0. If a copy of
7  *   the MPL was not distributed with this file, You
8  *   can obtain one at http://mozilla.org/MPL/2.0/.
9  *
10  * Authors:
11  *   Vladimir Panteleev <ae@cy.md>
12  */
13 
14 module ae.sys.windows.input;
15 version (Windows):
16 
17 import ae.sys.windows.imports;
18 mixin(importWin32!q{winbase});
19 mixin(importWin32!q{windef});
20 mixin(importWin32!q{winuser});
21 
22 /// Send WM_COPYDATA to the specified window.
23 void sendCopyData(HWND hWnd, DWORD n, const(void)[] buf)
24 {
25 	COPYDATASTRUCT cds;
26 	cds.dwData = n;
27 	cds.cbData = cast(uint)buf.length;
28 	cds.lpData = cast(PVOID)buf.ptr;
29 	SendMessage(hWnd, WM_COPYDATA, 0, cast(LPARAM)&cds);
30 }
31 
32 private enum MAPVK_VK_TO_VSC = 0;
33 
34 /// Simulate keyboard input.
35 void keyDown(ubyte c) { keybd_event(c, cast(ubyte)MapVirtualKey(c, MAPVK_VK_TO_VSC), 0              , 0); }
36 void keyUp  (ubyte c) { keybd_event(c, cast(ubyte)MapVirtualKey(c, MAPVK_VK_TO_VSC), KEYEVENTF_KEYUP, 0); } /// ditto
37 
38 void press(ubyte c, uint delay=0)
39 {
40 	if (c) keyDown(c);
41 	Sleep(delay);
42 	if (c) keyUp(c);
43 	Sleep(delay);
44 } /// ditto
45 
46 void keyDownOn(HWND h, ubyte c) { PostMessage(h, WM_KEYDOWN, c, MapVirtualKey(c, MAPVK_VK_TO_VSC) << 16); } /// ditto
47 void keyUpOn  (HWND h, ubyte c) { PostMessage(h, WM_KEYUP  , c, MapVirtualKey(c, MAPVK_VK_TO_VSC) << 16); } /// ditto
48 
49 void pressOn(HWND h, ubyte c, uint delay=0)
50 {
51 	if (c) keyDownOn(h, c);
52 	Sleep(delay);
53 	if (c) keyUpOn(h, c);
54 	Sleep(delay);
55 } /// ditto