上次講的是鍵盤事件,這次我們介紹滑鼠事件。下面先介紹下滑鼠事件的結構體以及相關資訊。
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 當滑鼠有鍵被按下或者釋放 */
本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/
下面給一個範例程式,實現在控制台視窗緩衝區的最下面一行顯示當前滑鼠在緩衝區的座標,單擊左鍵在當前滑鼠位置輸出字母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!的圖: