Top-Down Structs

Regan Heath regan at netwin.co.nz
Sun Mar 12 01:10:35 PST 2006


Here is the code I used to test this, to save someone else the trouble.

Regan

-----------

import std.c.windows.windows;
import std.stdio;

// INPUT_RECORD [A]

struct INPUT_RECORD {
	WORD EventType;
	union bob {
		KEY_EVENT_RECORD KeyEvent;
		MOUSE_EVENT_RECORD MouseEvent;
		WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
		MENU_EVENT_RECORD MenuEvent;
		FOCUS_EVENT_RECORD FocusEvent;
	}
	bob a;
}

alias INPUT_RECORD* PINPUT_RECORD;

// Structs contained in INPUT_RECORD [B]

struct KEY_EVENT_RECORD {
   BOOL bKeyDown;
   WORD wRepeatCount;
   WORD wVirtualKeyCode;
   WORD wVirtualScanCode;
   union  {  WCHAR UnicodeChar;  CHAR AsciiChar;  }
   DWORD dwControlKeyState;
}

struct MOUSE_EVENT_RECORD {
   COORD dwMousePosition;
   DWORD dwButtonState;
   DWORD dwControlKeyState;
   DWORD dwEventFlags;
}

struct COORD {
     SHORT X;
     SHORT Y;
}

struct WINDOW_BUFFER_SIZE_RECORD { COORD dwSize; }
struct MENU_EVENT_RECORD { UINT dwCommandId; }
struct FOCUS_EVENT_RECORD { BOOL bSetFocus; }

extern(Windows) {
	BOOL ReadConsoleInputA(HANDLE hConsoleInput, PINPUT_RECORD lpBuffer,  
DWORD nLength, LPDWORD lpNumberOfEventsRead);
	BOOL ReadConsoleInputW(HANDLE hConsoleInput, PINPUT_RECORD lpBuffer,  
DWORD nLength, LPDWORD lpNumberOfEventsRead);
	
	HANDLE GetStdHandle(DWORD nStdHandle);
	
	DWORD STD_INPUT_HANDLE    = cast(DWORD)-10;
	DWORD STD_OUTPUT_HANDLE   = cast(DWORD)-11;
	DWORD STD_ERROR_HANDLE    = cast(DWORD)-12;

	WORD KEY_EVENT					= 0x0001; // Event contains key event record
	WORD MOUSE_EVENT				= 0x0002; // Event contains mouse event record
	WORD WINDOW_BUFFER_SIZE_EVENT	= 0x0004; // Event contains window change  
event record
	WORD MENU_EVENT					= 0x0008; // Event contains menu event record
	WORD FOCUS_EVENT				= 0x0010; // event contains focus change
}

char[][WORD] types;

static this()
{
	types[KEY_EVENT] = "Key Event";
	types[MOUSE_EVENT] = "Mouse Event";
	types[WINDOW_BUFFER_SIZE_EVENT] = "Window Buffer Size Event";
	types[MENU_EVENT] = "Menu Event";
	types[FOCUS_EVENT] = "Focus Event";
}

void main()
{
	HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
	INPUT_RECORD rec;
	DWORD rd;

	writefln("INPUT_RECORD.sizeof = ",INPUT_RECORD.sizeof);
	
	if (ReadConsoleInputA(hIn,&rec,cast(DWORD)1,&rd) == 0) {
		writefln("ReadConsoleInputA failed");
		return ;
	}
	
	writefln(rd," records read:");
	writefln("Type: ",types[rec.EventType]);
}



More information about the Digitalmars-d-bugs mailing list