用C++读取鼠标在控制台上的操作
与读取键盘信息类似,读取鼠标信息也是通过 ReadConsoleInput
函数来实现
咱先说一下需要用到的头文件:
#include <windows.h>
响应鼠标点击事件的变量类型
INPUT_RECORD
咱先介绍一下ReadConsoleInput
这个函数
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition; // 当前鼠标位置
DWORD dwButtonState; // 鼠标按钮状态
DWORD dwControlKeyState; // 键盘控制键状态
DWORD dwEventFlags; // 事件状态
} MOUSE_EVENT_RECORD;
//这个东西一般都在"INPUT_RECORD的变量名.Event.MouseEvent.以上变量"
-
第一个参数存放鼠标的位置信息,类型为 COORD 坐标类型;
-
第二个参数(dwButtonState)为鼠标的按键状态,包含的值如下:
鼠标按键状态码(dwButtonState) | 说明 |
---|---|
FROM_LEFT_1ST_BUTTON_PRESSED | 最左边按键 |
FROM_LEFT_2ND_BUTTON_PRESSED | 左起第二个按键 |
FROM_LEFT_3RD_BUTTON_PRESSED | 左起第三个按键 |
FROM_LEFT_4TH_BUTTON_PRESSED | 左起第四个按键 |
RIGHTMOST_BUTTON_PRESSED | 最右边按键 |
-
第三个参数是键盘控制键状态,这个和上一章的内容是一样的;
-
最后一个参数(dwEventFlag)为事件状态:
事件状态码(dwEventFlag) | 说明 |
---|---|
DOUBLE_CLICK | 双击 |
MOUSE_MOVED | 移动 |
MOUSE_WHEELED | 滚轮滚动(只适用于Windows 2000/XP) |
在程序开头应加上
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
//这是用来添加鼠标输入设备的
用法举例
//我写的一个简单地例子
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
INPUT_RECORD mouseRec;
DWORD res;
while(1)
{
ReadConsoleInput(hIn, &mouseRec, 1, &res);//读取一个鼠标操作
if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)//如果点击了左键
{
if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)//如果是双击
{
break; //退出循环
}
else//单击的情况
{
cout<<mouseRec.Event.MouseEvent.dwMousePosition.X<<" "<<mouseRec.Event.MouseEvent.dwMousePosition.Y<<endl;//输出当前鼠标的位置
}
}
}
CloseHandle(hOut); // 关闭标准输出设备句柄
CloseHandle(hIn); // 关闭标准输入设备句柄
}
//摘自网络
#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;
}