羽夏閒談——滑鼠連點器

寂靜的羽夏發表於2021-10-10

前言

  玩95版植物大戰殭屍的打殭屍遊戲被打自閉了,到了進度中間殭屍出的速度就離譜,打都打不完,手和滑鼠都要點費了。我堂堂一個會程式設計的人,想通過這個關卡,於是乎寫一個滑鼠連點器的念頭就起來了。

羽夏閒談——滑鼠連點器

就這麼離譜

原理

  何為滑鼠連點器,顧名思義,通過某種方式實現快速在某個位置連續點選。本次我們將用C語言來實現一個簡陋的滑鼠連點器。為啥說簡陋呢?一是不好看,是一個黑框控制檯;二是不能隨便自定義設定,需要改程式碼。但滑鼠連點器的精髓都在於此。
  既然實現滑鼠連點器的功能,我們就必須找到能夠模擬出滑鼠點選的API。經過查詢,找到如下庫函式:

WINUSERAPI VOID WINAPI mouse_event(
	DWORD dwFlags,
	DWORD dx,
	DWORD dy,
	DWORD dwData,
	ULONG_PTR dwExtraInfo);

  這個函式的功能是用於滑鼠的移動和點選。從函式的名稱就知道這東西是幹啥的,發起一個滑鼠事件,滑鼠不就能幹點選、滾輪滾動、移動游標的事情嗎?我們需要點選滑鼠幾下,呼叫這個函式幾次不就行了嗎?實現模擬點選呼叫如下:

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //當前位置點選一次滑鼠

  我比較懶,我想點選鍵盤的某一個按鍵就在我滑鼠的位置持續連點,就需要知道這個按鍵的狀態,那麼用到下面這個API

WINUSERAPI SHORT WINAPI GetAsyncKeyState(int vKey);

  如果我想檢測Control這個按鍵的狀態,我們需要這樣呼叫:

GetAsyncKeyState(VK_CONTROL);

  VK_CONTROL是一個列舉,它的值代表一個按鍵,其他的按鍵自行檢視。
  所有需要的函式都瞭解了,我們就開始寫程式碼了。

#include <windows.h>    //GetAsyncKeyState 和 mouse_event 兩個函式需要引用的標頭檔案

int main()
{
    //輪巡按鍵狀態
    while (1)
    {
        //CONTROL鍵是否被按下,是的話進入連點迴圈
        while (GetAsyncKeyState(VK_CONTROL))
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
            Sleep(5);    //更改引數可以調整連點頻率
        }
        //ESCAPE鍵被按下的話,直接退出迴圈結束
        if (GetAsyncKeyState(VK_ESCAPE))
            break;
        Sleep(10);    //更改此引數可以調整輪巡按鍵頻率
    }
    return 0;
}

  上面的程式碼還呼叫了Sleep函式,這個函式是用來暫停一會兒當前執行緒的。故名思意就是先睡一會不操作。睡到指定時間再醒過來繼續執行。傳遞的引數是時間,單位是毫秒。通過這個可以調整頻率,減少CPU負擔。

測試

  讓那些殭屍們感受到恐懼吧!!!

羽夏閒談——滑鼠連點器

結語

  本人火絨粉,從論壇看到 點選器傳播病毒暗刷流量 ,有些感慨。就這一個小功能就被下毒,有點感慨很多軟體越來越流氓,IT現在的軟體環境比較良心的少了。
  說點題外話,軟體免費功能強大,投放廣告你投也就罷了,能不能投點正常的廣告?有些軟體原本良心,現在動不動就公開下毒,蒐集資訊或暗刷流量或劫持等等有意思嗎?哪些軟體我就不說了,隨便就一大堆。
  好了,不說了。現在做一個小總結:通過GetAsyncKeyState獲取指定按鍵狀態確定開始連點,用mouse_event實現模擬點選,連點器的功能就完全實現了。加一個 GUI,再加可以自定義的設定程式碼,一個連點器就徹底完成了。

相關文章