羽夏閑談——滑鼠連點器

前言

  玩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,再加可以自定義的設置程式碼,一個連點器就徹底完成了。