<知識分享>
上次講的是鍵盤事件,這次我們介紹鼠標事件。下面先介紹下鼠標事件的結構體以及相關信息。
- typedef struct _MOUSE_EVENT_RECORD //鼠標事件結構體
- {
- COORD dwMousePosition; //當前鼠標在控制台窗口緩沖區的位置
- DWORD dwButtonState; //鼠標按鍵的狀態
- DWORD dwControlKeyState; //控制鍵狀態
- DWORD dwEventFlags; //鼠標事件類型
- } MOUSE_EVENT_RECORD;
- /*
- 其中鼠標按鍵狀態dwButtonState可能的值有
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- FROM_LEFT_1ST_BUTTON_PRESSED 最左邊的鼠標鍵被按下 一般來說就是鼠標左鍵
- FROM_LEFT_2ND_BUTTON_PRESSED 左起第二個鼠標鍵被按下 一般來說是鼠標中鍵,就是滾輪鍵
- FROM_LEFT_3RD_BUTTON_PRESSED 左起第三個鼠標鍵被按下
- FROM_LEFT_4TH_BUTTON_PRESSED 左起第四個鼠標鍵被按下
- RIGHTMOST_BUTTON_PRESSED 最右邊的鼠標鍵被按下 一般來說是鼠標右鍵
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 控制鍵狀態dwControlKeyState與鍵盤事件的一樣
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ENHANCED_KEY 擴展鍵被按下
- LEFT_ALT_PRESSED 左Alt鍵被按下
- LEFT_CTRL_PRESSED 左Ctrl鍵被按下
- RIGHT_ALT_PRESSED 右Alt鍵被按下
- RIGHT_CTRL_PRESSED 右Ctrl鍵被按下
- NUMLOCK_ON 數字鎖定被打開
- SCROLLLOCK_ON 滾動鎖定被打開
- CAPSLOCK_ON 大寫鎖定被打開
- SHIFT_PRESSED Shift鍵被按下
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 鼠標事件類型dwEventFlags有以下幾種
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- DOUBLE_CLICK 雙擊,第一擊只作為普通按鍵事件,第二擊才作為雙擊事件
- MOUSE_HWHEELED 水平鼠標滾輪移動
- MOUSE_MOVED 鼠標移動
- MOUSE_WHEELED 垂直鼠標滾輪移動
- 0 當鼠標有鍵被按下或者釋放
- */
下面給一個樣例程序,實現在控制台窗口緩沖區的最下面一行顯示當前鼠標在緩沖區的坐標,單擊左鍵在當前鼠標位置輸出字母A,單擊右鍵則輸出字母B,雙擊任何鼠標鍵退出的功能。程序如下:
- #include <stdio.h>
- #include <windows.h>
- #include <conio.h>
- HANDLE handle_in;
- HANDLE handle_out;
- CONSOLE_SCREEN_BUFFER_INFO csbi; //定義窗口緩沖區信息結構體
- void DisplayMousePosition(COORD pos); //顯示鼠標所在位置
- void gotoxy(int x, int y); //將光標移到坐標為(x,y)的位置
- int main()
- {
- handle_in = GetStdHandle(STD_INPUT_HANDLE); //獲得標准輸入設備句柄
- handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //獲得標准輸出設備句柄
- INPUT_RECORD mouserec; //定義輸入事件結構體
- DWORD res; //用於存儲讀取記錄
- COORD pos; //用於存儲鼠標當前位置
- COORD size = {80, 25}; //窗口緩沖區大小
- GetConsoleScreenBufferInfo(handle_out, &csbi); //獲得窗口緩沖區信息
- SetConsoleScreenBufferSize(handle_out, size); //設置窗口緩沖區大小
- for (;;)
- {
- ReadConsoleInput(handle_in, &mouserec, 1, &res); //讀取輸入事件
- pos = mouserec.Event.MouseEvent.dwMousePosition; //獲得當前鼠標位置
- gotoxy(0, 24); //在第25行顯示鼠標位置
- DisplayMousePosition(pos); //顯示鼠標位置
- if (mouserec.EventType == MOUSE_EVENT) //如果當前為鼠標事件
- {
- gotoxy(pos.X, pos.Y);
- //單擊鼠標左鍵,輸出字符A
- if (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
- {
- putchar('A');
- }
- //單擊鼠標右鍵,輸出字符B
- if (mouserec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)
- {
- putchar('B');
- }
- //雙擊退出
- if (mouserec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
- {
- break;
- }
- }
- }
- CloseHandle(handle_out);
- CloseHandle(handle_in);
- return 0;
- }
- void DisplayMousePosition(COORD pos)
- {
- COORD dis = {0, 24}; //在第24行顯示鼠標位置
- WORD att = FOREGROUND_GREEN | FOREGROUND_INTENSITY; //文本屬性
- GetConsoleScreenBufferInfo(handle_out, &csbi); //獲得窗口緩沖區信息
- printf("X = %3d, Y = %3d", (int)pos.X, (int)pos.Y);
- FillConsoleOutputAttribute(handle_out, att, 16, dis, NULL); //填充文本屬性
- return;
- }
- void gotoxy(int x, int y)
- {
- COORD pos = {x, y};
- SetConsoleCursorPosition(handle_out, pos);
- }
附上用本程序寫的Hello world!的圖: