日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言在控制台上实现鼠标操作的方法

發布時間:2023/12/9 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言在控制台上实现鼠标操作的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 了解windows庫函數
  • 了解句柄
  • 實現思路與代碼

在制作面向用戶系統時,我們往往需要設置除輸入參數外更為靈活的操作方式,例如鼠標點擊、按鍵按下(無阻塞輸入)等;同時,我們需要制作更為精美的 UI而不是簡陋的黑白界面。然而,純C語言本身并不提供這些函數,為實現這些操作,我們需要調用 windows.h庫中的函數(當然大前提是用戶使用 windows系統)。

為實現鼠標操作,我們所涉及到的有關函數有:

了解windows庫函數

  • GetCursorPos(POINT* point); 獲得鼠標在桌面中的坐標(左上角為原點),其中POINT是一個結構體類,包含x和y兩個成員以表示橫坐標和縱坐標。
  • GetWindowRect(HWND hwnd,LPRECT* lprect);獲得指定窗口的坐標信息(包括頂部和底部的橫坐標,左端和右端的縱坐標),其中HWND是一個句柄類(句柄概念在后文中再說明),LPRECT是一個結構體類,包含top,bottom,left,right分別表示頂部、底部、左端、右端的坐標。
  • GetAsyncKeyState(int vKey);判斷指定按鍵是否按下,vKey為按鍵對應的ASCII值,如圖所示。


  • FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);返回指定窗口的句柄,lpClassName指向一個用于指定類名的字符串,若為NULL則查找所有窗口;lpWindowName指定一個用于查找窗口名。
  • 接下來還有一些windows.h庫中的特殊函數:

  • SetConsoleTitle(LPCSTR lpcstr);為程序設定標題。
  • Sleep(int int);休眠,即暫停程序int秒后繼續運行。
  • 了解句柄

    接下來說明句柄的概念:句柄是一種特殊指針(另一種說法為一種整型),用于標識應用程序中的對象(如窗口,按鈕,圖標等)。當前系統中每一個進程,每一個控件,都根據其虛擬內存地址擁有其對應的唯一句柄。于是,我們可以通過一個句柄找到對應的對象來指定操作。

    知道以上函數后,我們就可以正式編寫程序了。

    實現思路與代碼

    思路:通過一個循環反復檢測鼠標是否按下,如果按下,則檢測當前鼠標光標在控制臺中所對應的坐標,通過對控制臺中UI的坐標進行對應來判斷操作。值得一提的是,windows.h庫中沒有直接返回鼠標光標在控制臺窗口中坐標的函數,于是我們通過得到鼠標光標在桌面中的坐標和控制臺窗口在桌面中的坐標,來計算鼠標光標與控制臺窗口的相對位置。

    #include<stdio.h> #include<windows.h>void MouseOpreate(int *x,int *y); int main(){...SetConsoleTitle("憨憨");//設定窗口標題...int x,y;MouseOpreate(&x,&y);if((0<=x && x<=100)&&(0<=y && y<=20)){//通過UI在程序中對應的坐標指定操作...}else if(...){...} } void MouseOpreate(int *x,int *y){POINT *ptrpos;//聲明POINT結構體類存儲鼠標坐標LPRECT rect;//聲明LPRECT結構體指針存儲窗口坐標信息HWND hwnd=FindWindow(NULL,"憨憨");//根據上述設定的標題查找句柄,第一個形參設為NULL意味著查找系統中所有句柄ptrpos=(POINT*)malloc(sizeof(POINT)+64);rect=(LPRECT*)malloc(sizeof(LPRECT)+64);//為結構體指針分配內存空間for(;;){Sleep(500);//通過休眠指定循環周期為500毫秒if(GetAsyncKeyState(VK_LBUTTON)){//如果鼠標左鍵按下,其中VK_LBUTTON是windows.h庫中定義的宏,對應鼠標左鍵對應的ASCII值GetWindowRect(hwnd,rect);//根據查找標題"憨憨"得到的句柄返回對于窗口的坐標并存儲在rect中GetCursorPos(ptrpos);//返回鼠標對應的坐標并存儲在ptrpos中*x=ptrpos->x-rect->left;//鼠標橫坐標-控制臺窗口左端橫坐標得到鼠標相對控制臺窗口的橫坐標*y=ptrpos->y-rect->top;//同理得到鼠標相對的縱坐標break;//得到坐標后跳出循環}}

    接下來,我們只需要在檢測位置畫上對應的UI,就可以完成判定了。

    總結

    以上是生活随笔為你收集整理的C语言在控制台上实现鼠标操作的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。