用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.以上变量"
  1. 第一个参数存放鼠标的位置信息,类型为 COORD 坐标类型;

  2. 第二个参数(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 最右边按键
  1. 第三个参数是键盘控制键状态,这个和上一章的内容是一样的;

  2. 最后一个参数(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;  
}
posted @ 2020-01-25 17:13  Winter_Misty  阅读(2650)  评论(6编辑  收藏  举报