與讀取鍵盤信息類似,讀取鼠標信息也是通過 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;
}