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

我在看到这一章之前一直不知道控制台也能通过鼠标来操作。控制台的鼠标操作需要得到鼠标位置信息,左右键信息,单双击等等。

效果

当鼠标在控制台范围内的时候,第一行会显示鼠标的位置;左键单击在鼠标当前位置写下一个A,右键单击在鼠标当前位置写下一个a;左键双击控制台退出。


相关信息

与读取键盘信息类似,读取鼠标信息也是通过 ReadConsoleInput 函数来实现,区别在判断了 MOUSE_EVENT 后,将使用 MOUSE_EVENT_RECORD:

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)

控制台读取鼠标信息

#include   
#include   

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;  
}  

你可能感兴趣的:(console,VC,C/C++)