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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM