读取输入缓冲区事件

【勇芳软件工作室】汉化HomePreviousNext

ReadConsoleInput功能可用于直接访问控制台的输入缓冲区。当创建控制台时,鼠标输入被启用,窗口输入被禁用。为了确保进程接收所有类型的事件,本示例使用SetConsoleMode功能来启用窗口和鼠标输入。然后,它进入一个读取和处理控制台输入事件的循环。

VOID MouseEventProc(MOUSE_EVENT_RECORD);

VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);

VOID KeyEventProc(KEY_EVENT_RECORD);

VOID GetInputEvents(VOID);

DWORD主(VOID){

HANDLE hStdin;

DWORD cNumRead, fdwMode, fdwSaveOldMode, i;

INPUT_RECORD irInBuf[128];

/ *获取标准输入句柄。*/

hStdin = GetStdHandle(STD_INPUT_HANDLE);

if (hStdin == INVALID_HANDLE_VALUE)

MyErrorExit("GetStdHandle");

/ *保存当前输入模式,退出时恢复。*/

if(!GetConsoleMode(hStdin,& fdwSaveOldMode))

MyErrorExit("GetConsoleMode");

/ *启用窗口和鼠标输入事件。*/

fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;

if(!SetConsoleMode(hStdin,fdwMode))

MyErrorExit("SetConsoleMode");

/ *循环读取和处理输入事件。*/

而(1){

/ *等待事件。*/

如果(!读控制台输入(da

hStdin,/ *输入缓冲区句柄* /

irInBuf,/ *缓冲区读入* /

128,/ *读缓冲区大小* /

& cNumRead))/ *记录数*

MyErrorExit("ReadConsoleInput");

/ *将事件发送到相应的处理程序。*/

for (i = 0; i < cNumRead; i++)

switch(irInBuf [i] .EventType){

case KEY_EVENT: /* keyboard input */

KeyEventProc(irInBuf[i].Event.KeyEvent);

break;

case MOUSE_EVENT: /* mouse input */

MouseEventProc(irInBuf[i].Event.MouseEvent);

break;

case WINDOW_BUFFER_SIZE_EVENT: /* scrn buf. resizing */

ResizeEventProc(

irInBuf[i].Event.WindowBufferSizeEvent);

break;

case FOCUS_EVENT: /* disregard focus events */

case MENU_EVENT: /* disregard menu events */

break;

默认:

MyErrorExit("unknown event type");

break;

}

}

return 0;

}