本文为转载文档,原文链接:http://blog.csdn.net/bnb45/article/details/8042819
我在看到这一章之前一直不知道控制台也能通过鼠标来操作。控制台的鼠标操作需要得到鼠标位置信息,左右键信息,单双击等等。
当鼠标在控制台范围内的时候,第一行会显示鼠标的位置;左键单击在鼠标当前位置写下一个A,右键单击在鼠标当前位置写下一个a;左键双击控制台退出。
与读取键盘信息类似,读取鼠标信息也是通过 ReadConsoleInput 函数来实现,区别在判断了 MOUSE_EVENT 后,将使用 MOUSE_EVENT_RECORD:
[cpp] view plaincopy
- typedef struct _MOUSE_EVENT_RECORD {
- COORD dwMousePosition; // 当前鼠标位置
- DWORD dwButtonState; // 鼠标按钮状态
- DWORD dwControlKeyState; // 键盘控制键状态
- DWORD dwEventFlags; // 事件状态
- } MOUSE_EVENT_RECORD;
第一个参数存放鼠标的位置信息,类型为 COORD 坐标类型;第二个参数(dwButtonState)为鼠标的按键状态,包含的值如下:
鼠标按键状态码(dwButtonState) | 说明 |
FROM_LEFT_1ST_BUTTON_PRESSED | 最左边按键 |
RIGHTMOST_BUTTON_PRESSED | 最右边按键 |
FROM_LEFT_2ND_BUTTON_PRESSED | 左起第二个按键 |
FROM_LEFT_3RD_BUTTON_PRESSED | 左起第三个按键 |
FROM_LEFT_4TH_BUTTON_PRESSED | 左起第四个按键 |
第三个参数是键盘控制键状态,这个和上一章的内容是一样的;最后一个参数(dwEventFlag)为事件状态:
事件状态码(dwEventFlag) | 说明 |
DOUBLE_CLICK | 双击 |
MOUSE_MOVED | 移动 |
MOUSE_WHEELED | 滚轮滚动(只适用于Windows 2000/XP) |
[cpp] view plaincopy
- #include <windows.h>
- #include <stdio.h>
- int main(void)
- {
- // 获取标准输入输出设备句柄
- HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
- HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
- CONSOLE_SCREEN_BUFFER_INFO bInfo;
- INPUT_RECORD mouseRec;
- DWORD res;
- COORD crPos, crHome = {0, 0};
- printf("[Cursor Position] X: %2lu Y: %2lu\n", 0, 0); // 初始状态
- while (1)
- {
- ReadConsoleInput(hIn, &mouseRec, 1, &res);
- if (mouseRec.EventType == MOUSE_EVENT)
- {
- if (mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)
- {
- if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
- {
- break; // 左键双击 退出循环
- }
- }
- crPos = mouseRec.Event.MouseEvent.dwMousePosition;
- GetConsoleScreenBufferInfo(hOut, &bInfo);
- SetConsoleCursorPosition(hOut, crHome);
- printf("[Cursor Position] X: %2lu Y: %2lu", crPos.X, crPos.Y);
- SetConsoleCursorPosition(hOut, bInfo.dwCursorPosition);
- switch (mouseRec.Event.MouseEvent.dwButtonState)
- {
- case FROM_LEFT_1ST_BUTTON_PRESSED: // 左键 输出A
- FillConsoleOutputCharacter(hOut, 'A', 1, crPos, &res);
- break; // 如果使用printf输出,则之前需要先设置光标的位置
- case RIGHTMOST_BUTTON_PRESSED: // 右键 输出a
- FillConsoleOutputCharacter(hOut, 'a', 1, crPos, &res);
- break;
- default:
- break;
- }
- }
- }
- CloseHandle(hOut); // 关闭标准输出设备句柄
- CloseHandle(hIn); // 关闭标准输入设备句柄
- return 0;
- }