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