【C语言】控制台窗口图形界面编程(七):鼠标事件
00. 目錄
文章目錄
- 00. 目錄
- 01. INPUT_RECORD結(jié)構(gòu)
- 02. MOUSE_EVENT_RECORD結(jié)構(gòu)
- 03. ReadConsoleInput函數(shù)
- 04. 示例程序
01. INPUT_RECORD結(jié)構(gòu)
描述控制臺輸入緩沖區(qū)中的輸入事件。可以使用ReadConsoleInput或PeekConsoleInput函數(shù)從輸入緩沖區(qū)讀取這些記錄,也可以使用WriteConsoleInput函數(shù)將這些記錄寫入輸入緩沖區(qū)。
類型聲明:
typedef struct _INPUT_RECORD {WORD EventType;union {KEY_EVENT_RECORD KeyEvent;MOUSE_EVENT_RECORD MouseEvent;WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;MENU_EVENT_RECORD MenuEvent;FOCUS_EVENT_RECORD FocusEvent;} Event; } INPUT_RECORD;EventType
輸入事件類型的句柄和存儲在Event成員中的事件記錄。
該成員可以是以下值之一。
| FOCUS_EVENT 0x0010 | 該事件成員包含一個FOCUS_EVENT_RECORD結(jié)構(gòu)。這些事件在內(nèi)部使用,應(yīng)該被忽略。 |
| KEY_EVENT 0x0001 | 該事件成員包含一個KEY_EVENT_RECORD結(jié)構(gòu)有關(guān)鍵盤事件的信息。 |
| MENU_EVENT 0x0008 | 該事件成員包含一個MENU_EVENT_RECORD結(jié)構(gòu)。這些事件在內(nèi)部使用,應(yīng)該被忽略。 |
| MOUSE_EVENT 0x0002 | 所述事件構(gòu)件包含MOUSE_EVENT_RECORD結(jié)構(gòu)用約鼠標(biāo)移動或按鍵按壓事件的信息。 |
| WINDOW_BUFFER_SIZE_EVENT 0x0004 | 該事件成員包含一個WINDOW_BUFFER_SIZE_RECORD結(jié)構(gòu)有關(guān)控制臺屏幕緩沖區(qū)的新大小信息。 |
事件
事件信息。此成員的格式取決于EventType成員指定的事件類型。
02. MOUSE_EVENT_RECORD結(jié)構(gòu)
描述控制臺INPUT_RECORD結(jié)構(gòu)中的鼠標(biāo)輸入事件。
類型聲明:
typedef struct _MOUSE_EVENT_RECORD {COORD dwMousePosition;DWORD dwButtonState;DWORD dwControlKeyState;DWORD dwEventFlags; } MOUSE_EVENT_RECORD;成員說明
dwMousePosition
一個COORD結(jié)構(gòu),它根據(jù)控制臺屏幕緩沖區(qū)的字符單元格坐標(biāo)包含光標(biāo)的位置。
dwButtonState
鼠標(biāo)按鈕的狀態(tài)。最低有效位對應(yīng)于最左邊的鼠標(biāo)按鈕。下一個最低有效位對應(yīng)于最右邊的鼠標(biāo)按鈕。下一位表示從左到右的鼠標(biāo)按鈕。然后,這些位從左到右對應(yīng)鼠標(biāo)按鈕。如果按下按鈕,則位為1。
為前五個鼠標(biāo)按鈕定義了以下常量。
| FROM_LEFT_1ST_BUTTON_PRESSED 0x0001 | 最左邊的鼠標(biāo)按鈕。一般來說鼠標(biāo)左鍵 |
| FROM_LEFT_2ND_BUTTON_PRESSED 0x0004 | 左起第二個按鈕。一般來說是鼠標(biāo)中鍵,就是滾輪鍵 |
| FROM_LEFT_3RD_BUTTON_PRESSED 0x0008 | 左起第三個按鈕。 |
| FROM_LEFT_4TH_BUTTON_PRESSED 0x0010 | 左起第四個按鈕。 |
| RIGHTMOST_BUTTON_PRESSED 0x0002 | 最右邊的鼠標(biāo)按鈕。一般來說鼠標(biāo)右鍵 |
dwControlKeyState
控制鍵的狀態(tài)。該成員可以是以下一個或多個值。
| CAPSLOCK_ON 0x0080 | 大寫鎖定被打開 |
| ENHANCED_KEY 0x0100 | 擴(kuò)展鍵被按下 |
| LEFT_ALT_PRESSED 0x0002 | 按下左ALT鍵。 |
| LEFT_CTRL_PRESSED 0x0008 | 按下左CTRL鍵。 |
| NUMLOCK_ON 0x0020 | 數(shù)字鎖定被打開 |
| RIGHT_ALT_PRESSED 0x0001 | 按下右ALT鍵。 |
| RIGHT_CTRL_PRESSED 0x0004 | 按下右CTRL鍵。 |
| SCROLLLOCK_ON 0x0040 | 滾動鎖定被打開 |
| SHIFT_PRESSED 0x0010 | 按下SHIFT鍵。 |
dwEventFlags
鼠標(biāo)事件的類型。如果此值為零,則表示正在按下或釋放鼠標(biāo)按鈕。否則,此成員是以下值之一。
| DOUBLE_CLICK 0x0002 | 雙擊的第二次單擊(按下按鈕)發(fā)生。第一次單擊作為常規(guī)按鈕事件返回。 |
| MOUSE_HWHEELED 0x0008 | 水平鼠標(biāo)滾輪被移動了。如果dwButtonState成員的高位字包含正值,則輪子向右旋轉(zhuǎn)。否則,車輪向左旋轉(zhuǎn)。 |
| MOUSE_MOVED 0x0001 | 發(fā)生了鼠標(biāo)位置的變化。 |
| MOUSE_WHEELED 0x0004 | 垂直鼠標(biāo)滾輪被移動。如果dwButtonState成員的高位字包含正值,則輪向前旋轉(zhuǎn),遠(yuǎn)離用戶。否則,車輪向后旋轉(zhuǎn),朝向用戶。 |
03. ReadConsoleInput函數(shù)
從控制臺輸入緩沖區(qū)讀取數(shù)據(jù)并將其從緩沖區(qū)中刪除。
函數(shù)聲明:
BOOL WINAPI ReadConsoleInput(_In_ HANDLE hConsoleInput,_Out_ PINPUT_RECORD lpBuffer,_In_ DWORD nLength,_Out_ LPDWORD lpNumberOfEventsRead ); 功能:從控制臺輸入緩沖區(qū)讀取數(shù)據(jù)并將其從緩沖區(qū)中刪除。 參數(shù):hConsoleInput 控制臺輸入緩沖區(qū)的句柄。句柄必須具有GENERIC_READ訪問權(quán)限。lpBuffer 指向接收輸入緩沖區(qū)數(shù)據(jù)的INPUT_RECORD結(jié)構(gòu)數(shù)組的指針。nLength 數(shù)組元素中l(wèi)pBuffer參數(shù) 指向的數(shù)組大小。lpNumberOfEventsRead 指向接收讀取的輸入記錄數(shù)的變量的指針。返回值:如果函數(shù)成功,則返回值為非零值。如果函數(shù)失敗,則返回值為零。要獲取擴(kuò)展錯誤信息,請調(diào)用GetLastError。官方參考網(wǎng)址:https://docs.microsoft.com/en-us/windows/console/readconsoleinput
04. 示例程序
#include<stdio.h> #include<string.h> #include<stdlib.h>#include <Windows.h> #include <conio.h>int main(void) {//定義句柄變量HANDLE hOut = NULL;HANDLE hIn = NULL;//定義輸入事件結(jié)構(gòu)體INPUT_RECORD mouseRecord;//用于存儲讀取記錄DWORD res;//用于存儲鼠標(biāo)當(dāng)前位置COORD pos;//獲取標(biāo)準(zhǔn)輸出句柄hOut = GetStdHandle(STD_OUTPUT_HANDLE);//獲取標(biāo)準(zhǔn)輸入句柄hIn = GetStdHandle(STD_INPUT_HANDLE);while (1){//讀取輸入事件ReadConsoleInput(hIn, &mouseRecord, 1, &res);//獲取鼠標(biāo)當(dāng)前位置pos = mouseRecord.Event.MouseEvent.dwMousePosition;//如果當(dāng)前事件是鼠標(biāo)事件if (mouseRecord.EventType == MOUSE_EVENT){//單擊鼠標(biāo)左鍵if (mouseRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){printf("鼠標(biāo)左鍵單擊 x: %d y: %d\n", pos.X, pos.Y);}//單擊鼠標(biāo)右鍵if (mouseRecord.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED){printf("鼠標(biāo)右鍵單擊 x: %d y: %d\n", pos.X, pos.Y);}//如果是雙擊就退出循環(huán)if (mouseRecord.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK){break;}}}//關(guān)閉句柄CloseHandle(hOut);CloseHandle(hIn);//system("pause");getchar();return 0; }總結(jié)
以上是生活随笔為你收集整理的【C语言】控制台窗口图形界面编程(七):鼠标事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】DAC程序示例
- 下一篇: 【Libevent】Libevent学习