C語言 在程序中打開網頁,模擬鼠標點擊、鍵盤輸入
一、簡述
記--使用C語言 打開指定網頁,並模擬鼠標點擊、鍵盤輸入。實現半自動填寫賬號密碼,並登錄網站(當然現在的大部分網站都有驗證碼,或有檢測"非人為"操作,以防止惡意注冊、登錄)。
例子打包:鏈接: https://pan.baidu.com/s/1eStV0lAcmr8kmEA0n3LRcg 提取碼: 7kvj
二、效果 (程序填寫賬號密碼,實現半自動登錄)
三、工程結構
四、源文件
main.c文件
#include <stdio.h> #include <stdlib.h> #include <Windows.h> //ShellExecuteA() //打開某個網址:website (使用默認瀏覽器) void open_web(char *website) { ShellExecuteA(0,"open", website,0,0,1); } //模擬鼠標點擊 (x,y)是要點擊的位置 void click(int x, int y) { //將鼠標光標移動到 指定的位置 例子中屏幕分辨率1600x900 在鼠標坐標系統中,屏幕在水平和垂直方向上均勻分割成65535×65535個單元 mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, x*65535/1600, y*65535/900, 0, 0); Sleep(50);//稍微延時50ms mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//鼠標左鍵按下 mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//鼠標左鍵抬起 } //模擬鍵盤輸入 keybd_event(要按下的字符,0,動作,0);動作為0是按下,動作為2是抬起 void input() { char user[]="1234567890123";//賬號 char pwd[]="1234567890";//密碼 click(823,392); //點擊"用戶名輸入框"的位置 int i; //輸入賬號 for(i=0;i<sizeof(user);i++) { keybd_event(user[i],0,0,0); keybd_event(user[i],0,2,0); Sleep(30); } //tab鍵 對應的編號是0x09 讓密碼輸入框 獲取焦點 keybd_event(0x09,0,0,0);//按下 keybd_event(0x09,0,2,0); //松開 Sleep(30); //輸入密碼 for(i=0;i<sizeof(pwd);i++) { keybd_event(pwd[i],0,0,0); keybd_event(pwd[i],0,2,0); Sleep(30); } //模擬按下tab鍵 讓登錄按鈕獲取焦點 click(824,530);//點擊"登錄按鈕" Sleep(30); } //將chrome.exe進程殺掉,在例子中尚未使用 void close() { system("taskkill /f /im chrome.exe"); } int main(int argc,char *argv[]) { open_web("https://www.baidu.com/");//打開某個網址 Sleep(4000);//延時4秒,等待網頁打開完畢,再進行其它操作。根據實際情況(瀏覽器打開速度,網速) click(1454, 126);//點擊"登錄"(1454,126) Sleep(150); click(712,658);//點擊"用戶名登錄" Sleep(150); input();//模擬鼠標動作,鍵盤輸入 return 0; }
五、總結
5.1 ShellExecute()函數
功能 | 對指定的文件執行操作。(可以實現調用第三方程序) | |
頭文件 | Windows.h | |
原型 | HINSTANCE ShellExecuteA( HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd ); | |
參數 | hwnd | 父窗口的句柄。如果操作與窗口不關聯,則此值可以為空 |
lpOperation | 指定要執行的操作(謂詞) edit:啟動編輯器並打開文檔進行編輯。要打開的文檔文件由lpFile指定 explore:瀏覽由參數lpFile指定的文件夾 find:搜索由參數lpDirectory指定的目錄 open:打開lpFile參數指定的項。可以是文件或文件夾,或者是網頁。 print:打印由lpFile指定的文件。 NULL:默認操作。如果沒有,則使用“open”動詞。如果“open”不可用,系統將使用注冊表中列出的第一個謂詞。 |
|
lpFile | 操作對象(文件等。。。) | |
lpParameters | 如果lpFile指定可執行文件,則此參數是指向以-結束的字符串的指針,該字符串指定要傳遞給應用程序的參數。此字符串的格式由要調用的謂詞決定。如果lpFile指定文檔文件,則lpParameters應為空。 | |
lpDirectory | 指定操作的默認(工作)目錄。如果此值為NULL,則使用當前工作目錄。 | |
nShowCmd | 指定打開應用程序時如何顯示的標志。如果lpFile指定文檔文件,則只需將標志傳遞給關聯的應用程序。應該由應用程序來決定如何處理它。這些值是定義的。 SW_HIDE:隱藏 SW_MAXIMIZE :最大化 SW_MINIMIZE :最小化 。。。 |
|
返回值 | 如果函數成功,則返回大於32的值。如果函數失敗,它將返回一個錯誤值 | |
備注 | 更多詳見:https://docs.microsoft.com/en-us/windows/desktop/api/Shellapi/nf-shellapi-shellexecutea |
打開指定網頁:
ShellExecute(0, "open", "https://www.baidu.com/",0, 0, 1);//最后的參數是控制最大化、最小化,隱藏
打開某個可執行文件:
#include <stdio.h> #include <windows.h> //ShellExecute() int main(int argc, char *argv[]) { ShellExecute(0, "open", "C:\\Users\\newuser\\Desktop\\串口助手.exe",0, 0, 1);//最后的參數是控制最大化、最小化 printf("Hello World!\n"); return 0; }
5.2 mouse_event()函數
功能 | 合成鼠標運動和按鈕單擊。(模擬鼠標動作) | ||
頭文件 | Windows.h | ||
原型 | void mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo ); |
||
參數 | dwFlags | 控制鼠標運動和按鈕點擊的各個方面(鼠標動作類型) MOUSEEVENTF_LEFTDOWN:鼠標左鍵按下 MOUSEEVENTF_LEFTUP:鼠標左鍵抬起 MOUSEEVENTF_RIGHTDOWN:鼠標右鍵按下 MOUSEEVENTF_RIGHTUP:鼠標右鍵抬起 MOUSEEVENTF_WHEEL:鼠標滾輪,數值由參數dwData指定 MOUSEEVENTF_ABSOLUTE:鼠標光標位置,由參數dx,dy指定。 |
|
dx | x坐標 | ||
dy | y坐標 | ||
dwData | 滾輪滾動值 | ||
dwExtraInfo | 與鼠標事件關聯的附加值。調用GetMessageExtraInfo()以獲取此額外信息 | ||
返回值 | 無返回值 | ||
備注 | 詳見:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-mouse_event
|
示例一:將鼠標移動到指定(絕對)位置(x,y)
//例子中屏幕分辨率1600x900 在鼠標坐標系統中,屏幕在水平和垂直方向上均勻分割成65535×65535個單元 mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, x*65535/1600, y*65535/900, 0, 0);
示例二:按下鼠標左鍵,然后抬起
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//鼠標左鍵按下 mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//鼠標左鍵抬起
5.3 keybd_event()函數
功能 | 合成擊鍵。(模擬鍵盤輸入) | ||
頭文件 | Windows.h | ||
原型 | void keybd_event( BYTE bVk, BYTE bScan, DWORD dwFlags, ULONG_PTR dwExtraInfo ); | ||
參數 | bVk | 虛擬按鍵代碼編號 | |
bScan | 按鍵的的硬件掃描代碼 | ||
dwFlags | 控制功能操作的各個方面 KEYEVENTF_EXTENDEDKEY:如果指定,掃描代碼前面有一個前綴字節,其值為0xE0 KEYEVENTF_KEYUP:如果指定,則抬起按鍵。 |
||
dwExtraInfo | 按鍵動作的附加信息 | ||
返回值 | 無返回值 | ||
備注 | 詳見:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-keybd_event
|
示例三:模擬按下數字按鍵"9": (‘9’的和0x39都表示數字按鍵9)
keybd_event('9',0,0,0);//按下按鍵 ‘9’ keybd_event('9',0,2,0);//抬起按鍵 ‘9’ 或 0x39 keybd_event(0x39,0,0,0);//按下按鍵 ‘9’ keybd_event(0x39,0,2,0);//抬起按鍵 ‘9’
虛擬按鍵 代碼列表:https://docs.microsoft.com/zh-cn/windows/desktop/inputdev/virtual-key-codes
出處:https://blog.csdn.net/nanfeibuyi/article/details/85119726