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