一.簡介
鼠標(biāo)軌跡算法是一種模擬人類鼠標(biāo)操作的程序布讹,它能夠模擬出自然而真實的鼠標(biāo)移動路徑。
鼠標(biāo)軌跡算法的底層實現(xiàn)采用C/C++語言胚股,原因在于C/C++提供了高性能的執(zhí)行能力和直接訪問操作系統(tǒng)底層資源的能力。
鼠標(biāo)軌跡算法具有以下優(yōu)勢:
- 模擬人工軌跡:算法能夠模擬出非貝塞爾曲線的自然鼠標(biāo)移動,避免了機械式的直線移動位迂。
- 適當(dāng)?shù)耐nD/加速/減速:算法能夠根據(jù)需要模擬出鼠標(biāo)的停頓、加速和減速,使得軌跡更加真實囤官。
-
隨機軌跡:在固定兩點間冬阳,算法能夠生成不同的隨機軌跡,增加了軌跡的不可預(yù)測性党饮。
QQ截圖20241110111818.jpg
二.應(yīng)用場景
游戲鼠標(biāo)軌跡檢測(檢測能過無畏fps類型肝陪、傳奇、夢幻等游戲刑顺,已經(jīng)在游戲中驗證)
滑塊拖動驗證
部分網(wǎng)頁鼠標(biāo)軌跡檢測
三.支持多種編程語言
1.C++頭文件
/******************************************************************************************/
@SDK功能描述:C++鼠標(biāo)軌跡
/******************************************************************************************/
#ifndef _SN_SDK_H__
#define _SN_SDK_H__
#include <windows.h>
//返回參數(shù)
typedef struct SN_RESULT {
int code; //錯誤碼氯窍,如果為 0 表示成功,否則表示錯誤號
char message[4096]; //錯誤信息蹲堂,如果為 "OK" 表示成功狼讨,否則返回錯誤信息
}SN_RESULT;
//坐標(biāo)參數(shù)
typedef struct SN_POINT
{
int x; //屏幕坐標(biāo),左上角(0柒竞,0)政供,右下角(1920,1080 - 以實際屏幕為準(zhǔn))
int y; //屏幕坐標(biāo)朽基,左上角(0布隔,0),右下角(1920稼虎,1080 - 以實際屏幕為準(zhǔn))
}SN_POINT;
//軌跡參數(shù)
typedef struct SN_POINT_PARAMS
{
struct SN_POINT point;//屏幕坐標(biāo)衅檀,左上角(0,0)霎俩,右下角(1920哀军,1080 - 以實際屏幕為準(zhǔn))
int delayTime; //延時時間(單位:毫秒),僅供參考
}SN_POINT_PARAMS;
/*創(chuàng)建句柄
*
* 參數(shù):
* [in] szKey: 卡密
* [out] pResult: 返回錯誤信息打却,參數(shù)pResult.code(錯誤碼)如果為 0 表示成功杉适,否則表示錯誤號;
*
* 返回值:成功返回句柄,失敗返回NULL
*
*/
HANDLE WINAPI apiSNCreateHandle(char* szKey, SN_RESULT* pResult);
/*獲取鼠標(biāo)移動軌跡
*
* 參數(shù):
* [in] handle: 句柄(通過調(diào)用apiSNCreateHandle得到)
* [in] startPoint: 開始坐標(biāo)学密,左上角(0淘衙,0),右下角(1920腻暮,1080 - 以實際屏幕為準(zhǔn))
* [in] endPoint: 結(jié)束坐標(biāo)彤守,左上角(0,0)哭靖,右下角(1920具垫,1080 - 以實際屏幕為準(zhǔn))
* [out] points: 軌跡數(shù)組,如果數(shù)組中元素 point 出現(xiàn)(-1,-1),表示鼠標(biāo)軌跡結(jié)束
*
* 返回值:返回參數(shù)SN_RESULT.code(錯誤碼)如果為 0 表示成功试幽,否則表示錯誤號;
*
*/
SN_RESULT WINAPI apiSNMouseMove(HANDLE handle, SN_POINT startPoint, SN_POINT endPoint, SN_POINT_PARAMS* points);
/*獲取版本號
*
* 參數(shù):
* [in] handle: 句柄(通過調(diào)用apiSNCreateHandle得到)
* [out] szVersion: 版本號
*
* 返回值:返回參數(shù)SN_RESULT.code(錯誤碼)如果為 0 表示成功筝蚕,否則表示錯誤號;
*
*/
SN_RESULT WINAPI apiSNGetVersion(HANDLE handle, char* szVersion);
/*獲取錯誤信息
*
* 參數(shù):
* [in] handle: 句柄(通過調(diào)用apiSNCreateHandle得到)
*
* 返回值:返回參數(shù)SN_RESULT.code(錯誤碼)如果為 0 表示成功,否則表示錯誤號;
*
*/
SN_RESULT WINAPI apiSNGetError(HANDLE handle);
/*釋放句柄(內(nèi)存)
*
* 參數(shù):
* [in] handle: 句柄(通過調(diào)用apiSNCreateHandle得到)
*
* 返回值:返回參數(shù)SN_RESULT.code(錯誤碼)如果為 0 表示成功,否則表示錯誤號;
*
*/
SN_RESULT WINAPI apiSNDestroyHandle(HANDLE handle);
#endif // !_SN_SDK_H__
2.其他編程語言
為了易于集成和使用起宽,我們將鼠標(biāo)軌跡算法封裝為DLL(動態(tài)鏈接庫)洲胖。這種封裝方式不僅保留了算法的性能優(yōu)勢,還提供了跨平臺和跨語言的兼容性坯沪,目前支持編程語言如下:
- C++
- Python
- 易語言
推算軌跡算法耗時均為毫秒級绿映,<= 5ms ,速度超快腐晾,fps類型游戲完全無壓力叉弦!
3.鼠標(biāo)軌跡API調(diào)用流程圖
注意:如果是多線程,每個線程都需要通過apiSNCreateHandle創(chuàng)建HANDLE句柄,這樣才能多個線程互不影響
4.C++鼠標(biāo)軌跡接口
/****************************************************************************************/
@SDK功能描述:鼠標(biāo)軌跡
/******************************************************************************************/
.版本 2
.支持庫 spec
.程序集 窗口程序集_啟動窗口
.子程序 _啟動子程序, 整數(shù)型
_臨時子程序 ()
返回 (0)
.子程序 _臨時子程序
.局部變量 handle, 整數(shù)型
.局部變量 pResult, SN_RESULT, 靜態(tài), , 返回錯誤信息藻糖,參數(shù)pResult.code(錯誤碼)如果為 0 表示成功淹冰,否則表示錯誤號;
.局部變量 startPoint, SN_POINT, , , 開始坐標(biāo),左上角(0巨柒,0)樱拴,右下角(1920,1080 - 以實際屏幕為準(zhǔn))
.局部變量 endPoint, SN_POINT, , , 結(jié)束坐標(biāo)潘拱,左上角(0疹鳄,0)拧略,右下角(1920芦岂,1080 - 以實際屏幕為準(zhǔn))
.局部變量 points, SN_POINT_PARAMS, , "3000", 軌跡數(shù)組,如果數(shù)組中元素 point 出現(xiàn)(-1,-1),表示鼠標(biāo)軌跡結(jié)束
.局部變量 index, 整數(shù)型
' ---------------------------------------------------------------
' 1.創(chuàng)建句柄
' 其中卡密 SNKJww1gc5tmDZJWhD21DLArs6vV8DXzQPgW7c9y6e2w 僅用于測試垫蛆,需要找開發(fā)人員重新購買禽最,
' ---------------------------------------------------------------
handle = apiSNCreateHandle (“SNKJww1gc5tmDZJWhD21DLArs6vV8DXzQPgW7c9y6e2w”, “SNTrack.onnx”, pResult)
調(diào)試輸出 (pResult.code, 到文本 (pResult.message))
調(diào)試輸出 (“句柄”, handle)
.如果真 (pResult.code < 0)
調(diào)試輸出 (“-----------程序結(jié)束-----------”)
返回 ()
.如果真結(jié)束
startPoint.x = 10
startPoint.y = 10
endPoint.x = 100
endPoint.y = 100
調(diào)試輸出 (“預(yù)備定義數(shù)組數(shù)量”, 取數(shù)組成員數(shù) (points))
' ---------------------------------------------------------------
' 2.獲取鼠標(biāo)軌跡
' ---------------------------------------------------------------
apiSNMouseMove (handle, startPoint, endPoint, points)
調(diào)試輸出 (取變量地址 (startPoint.x), 取變量地址 (startPoint.y))
.計次循環(huán)首 (取數(shù)組成員數(shù) (points), index)
.如果真 (points [index].point.x = -1 且 points [index].point.y = -1)
刪除成員 (points, index + 1, 10000 - index)
跳出循環(huán) ()
.如果真結(jié)束
' 調(diào)試輸出 (index, “坐標(biāo)”, points [index].point.x, points [index].point.y, points [index].delayTime)
.計次循環(huán)尾 ()
調(diào)試輸出 (取數(shù)組成員數(shù) (points))
.計次循環(huán)首 (取數(shù)組成員數(shù) (points), index)
調(diào)試輸出 (“坐標(biāo)”, points [index].point.x, points [index].point.y, points [index].delayTime)
.計次循環(huán)尾 ()
' ---------------------------------------------------------------
' 3.釋放內(nèi)存
' ---------------------------------------------------------------
apiSNDestroyHandle (handle)
調(diào)試輸出 (“-----------程序結(jié)束-----------”)
————————————————
5.云盤源碼下載
云盤目錄介紹:
demo - 包含各種編程語言的demo
dll - 分別是x86和x64平臺所需要的dll/lib/h文件
windows 鼠標(biāo)軌跡測試工具 - exe測試鼠標(biāo)軌跡效果( demo 中的 c++ 工程編譯后的exe可執(zhí)行文件)
四.效果演示
- 1.開始坐標(biāo)為(100,100)袱饭,結(jié)束坐標(biāo)為(800川无,800),通過調(diào)用接口獲得 4 條鼠標(biāo)軌跡
-
2.開始坐標(biāo)為(1000虑乖,100)懦趋,結(jié)束坐標(biāo)為(800,800)疹味,通過調(diào)用接口獲得 2 條鼠標(biāo)軌跡
3cdb6cf550104cd3946b3bf63fd1f772.gif
五.常見問題
1.是否支持多線程
支持
2.如何使用多線程
參考前面的《2.鼠標(biāo)軌跡API調(diào)用流程圖》仅叫,多線程和單線程類似;如果是多線程,那么每個線程都需要通過apiSNCreateHandle創(chuàng)建HANDLE句柄,這樣才能多個線程互不影響
六.更新日志
- 2024.09.28 新增易語言demo
- 2024.09.21 修復(fù)部分水平/垂直軌跡出現(xiàn)負(fù)數(shù)的情況
- 2024.09.19 優(yōu)化部分軌跡延遲時間為0的情況(可能會造成鼠標(biāo)瞬移)
- 2024.08.20 優(yōu)化部分軌跡可能出現(xiàn)負(fù)數(shù)的問題
- 2024.07.15 優(yōu)化水平/垂直軌跡
- 2024.06.25 新增錯誤日志信息
- 2024.06.06 python 模擬人工鼠標(biāo)軌跡demo
- 2024.02.06 c++ 模擬人工鼠標(biāo)軌跡demo