Basically want to make a macro script
    Adam D. Ruppe via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Thu Nov 13 07:59:10 PST 2014
    
    
  
I wrote a program to get you started. It needs simpledisplay.d 
and color.d from my github https://github.com/adamdruppe/arsd
Just download those two files and put them in your folder along 
with the following contents as hotkey.d and you should get 
started.
I tested on Windows 7 to hotkey type some stuff into a Notepad 
window.
Here's the code:
// compile: dmd hotkey.d simpledisplay.d color.d 
-L/SUBSYSTEM:WINDOWS:5.0
// helper function to send a string. Call with like "hello!"w -- 
notice
// the w at the end of the string literal.
void sendString(wstring s) {
	INPUT[] inputs;
	inputs.reserve(s.length * 2);
	foreach(wchar c; s) {
                 // the basic pattern here is to send a unicode key
                 // pressed then released
		INPUT input;
		input.type = INPUT_KEYBOARD;
		input.ki.wScan = c;
		input.ki.dwFlags = KEYEVENTF_UNICODE;
		inputs ~= input;
		input.ki.dwFlags |= KEYEVENTF_KEYUP; // released...
		inputs ~= input;
	}
         // then send it to the operating system
	if(SendInput(inputs.length, inputs.ptr, INPUT.sizeof) != 
inputs.length) {
		import std.stdio;
		writeln("SendInput failed");
	}
}
// the SendInput function can also send other keys, see the MSDN 
link
// I gave in my last email for details.
void main() {
         // uses my simpledisplay.d to pop up a quick window
	import simpledisplay;
	enum hotkey_id = 1; // arbitrary unique ID for the program
	auto window = new SimpleWindow(100, 50);
	window.handleNativeEvent = delegate int(HWND hwnd, UINT msg, 
WPARAM wParam, LPARAM lParam) {
		if(hwnd !is window.impl.hwnd)
			return 1; // we don't care...
		switch(msg) {
			// 
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646279%28v=vs.85%29.aspx
			case WM_HOTKEY:
				if(wParam == hotkey_id) {
                                      // *** This is what happens 
when it is pressed!!! ***
					// MessageBoxA(window.impl.hwnd, "Hotkey", "Pressed!", 
MB_OK);
					sendString("Hey, it worked!"w);
					return 0;
				}
			goto default;
			default: return 1; // not handled, pass it on
		}
		return 0;
	};
	string message = "Hotkey ready";
	// you can also pass modifiers or a capital ASCII char here
	// warning though: when it sends input, it still considers the
	// modifiers down. So like if you make it MOD_ALT and 'K', and 
send
	// the string 'Hello'... alt is still down, so the program will 
think
	// the user hit alt+H - and thus bring up the Help menu!
         //
         // *** This registers the key with the operating system 
***
	if(!RegisterHotKey(window.impl.hwnd, hotkey_id, 0, VK_F2)) {
		message = "RegisterHotKey failed";
	}
	{
		auto painter = window.draw();
		painter.drawText(Point(0, 0), message);
	}
	window.eventLoop(0); // draw our window
}
// these are bindings to the necessary Windows API functions
import core.sys.windows.windows;
// 
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.85%29.aspx
extern(Windows) BOOL RegisterHotKey(HWND, int, UINT, UINT);
// 
http://msdn.microsoft.com/en-us/library/ms646310%28v=vs.85%29.aspx
extern(Windows) UINT SendInput(UINT, INPUT*, int);
struct INPUT {
	DWORD type;
	union {
		MOUSEINPUT mi;
		KEYBDINPUT ki;
		HARDWAREINPUT hi;
	}
}
struct MOUSEINPUT {
	LONG      dx;
	LONG      dy;
	DWORD     mouseData;
	DWORD     dwFlags;
	DWORD     time;
	ULONG_PTR dwExtraInfo;
}
struct KEYBDINPUT {
	WORD      wVk;
	WORD      wScan;
	DWORD     dwFlags;
	DWORD     time;
	ULONG_PTR dwExtraInfo;
}
struct HARDWAREINPUT {
	DWORD uMsg;
	WORD wParamL;
	WORD wParamH;
}
enum INPUT_MOUSE = 0;
enum INPUT_KEYBOARD = 1;
enum INPUT_HARDWARE = 2;
enum MOD_ALT = 0x1;
enum MOD_CONTROL = 0x2;
enum MOD_NOREPEAT = 0x4000; // unsupported
enum MOD_SHIFT = 0x4;
enum MOD_WIN = 0x8; // reserved
enum WM_HOTKEY = 0x0312;
enum KEYEVENTF_EXTENDEDKEY = 0x1;
enum KEYEVENTF_KEYUP = 0x2;
enum KEYEVENTF_SCANCODE = 0x8;
enum KEYEVENTF_UNICODE = 0x4;
    
    
More information about the Digitalmars-d-learn
mailing list