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