您的位置:首页 > 其它

控制台界面控制(十):读取鼠标操作

2016-01-07 19:44 316 查看
本文为转载文档,原文链接: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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: