• 用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
    ", 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;  
    }
    
  • 相关阅读:
    BZOJ2243: [SDOI2011]染色(树链剖分/LCT)
    BZOJ2157: 旅游(LCT)
    BZOJ3510首都(LCT)
    BZOJ4530 [BJOI2014]大融合(LCT)
    BZOJ2631: tree(LCT)
    BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
    BZOJ3282: Tree (LCT模板)
    [NOI2008]假面舞会(DFS)
    斜率优化dp练习
    BZOJ2049[Sdoi2008]Cave 洞穴勘测(LCT模板)
  • 原文地址:https://www.cnblogs.com/fox-nest/p/12233197.html
Copyright © 2020-2023  润新知