C++模擬真人移動(dòng)鼠標(biāo)軌跡算法

一.簡介

鼠標(biāo)軌跡算法是一種模擬人類鼠標(biāo)操作的程序,它能夠模擬出自然而真實(shí)的鼠標(biāo)移動(dòng)路徑。

鼠標(biāo)軌跡算法的底層實(shí)現(xiàn)采用C/C++語言,原因在于C/C++提供了高性能的執(zhí)行能力和直接訪問操作系統(tǒng)底層資源的能力。

鼠標(biāo)軌跡算法具有以下優(yōu)勢:

  • 模擬人工軌跡:算法能夠模擬出非貝塞爾曲線的自然鼠標(biāo)移動(dòng),避免了機(jī)械式的直線移動(dòng)。
  • 適當(dāng)?shù)耐nD/加速/減速:算法能夠根據(jù)需要模擬出鼠標(biāo)的停頓、加速和減速,使得軌跡更加真實(shí)。
  • 隨機(jī)軌跡:在固定兩點(diǎn)間,算法能夠生成不同的隨機(jī)軌跡,增加了軌跡的不可預(yù)測性。


    QQ截圖20241110111818.jpg

二.應(yīng)用場景

游戲鼠標(biāo)軌跡檢測(檢測能過無畏fps類型、傳奇、夢幻等游戲,已經(jīng)在游戲中驗(yàn)證)
滑塊拖動(dòng)驗(yàn)證
部分網(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; //錯(cuò)誤碼,如果為 0 表示成功,否則表示錯(cuò)誤號(hào)
 
char message[4096]; //錯(cuò)誤信息,如果為 "OK" 表示成功,否則返回錯(cuò)誤信息
 
}SN_RESULT;
 
//坐標(biāo)參數(shù)
 
typedef struct SN_POINT
 
{
 
int x; //屏幕坐標(biāo),左上角(0,0),右下角(1920,1080 - 以實(shí)際屏幕為準(zhǔn))
 
int y; //屏幕坐標(biāo),左上角(0,0),右下角(1920,1080 - 以實(shí)際屏幕為準(zhǔn))
 
}SN_POINT;
 
//軌跡參數(shù)
 
typedef struct SN_POINT_PARAMS
 
{
 
struct SN_POINT point;//屏幕坐標(biāo),左上角(0,0),右下角(1920,1080 - 以實(shí)際屏幕為準(zhǔn))
 
int delayTime; //延時(shí)時(shí)間(單位:毫秒),僅供參考
 
}SN_POINT_PARAMS;
 
/*創(chuàng)建句柄
*
* 參數(shù):
* [in] szKey: 卡密
* [out] pResult: 返回錯(cuò)誤信息,參數(shù)pResult.code(錯(cuò)誤碼)如果為 0 表示成功,否則表示錯(cuò)誤號(hào);
*
* 返回值:成功返回句柄,失敗返回NULL
*
*/
 
HANDLE WINAPI apiSNCreateHandle(char* szKey, SN_RESULT* pResult);
 
/*獲取鼠標(biāo)移動(dòng)軌跡
*
* 參數(shù):
* [in] handle: 句柄(通過調(diào)用apiSNCreateHandle得到)
* [in] startPoint: 開始坐標(biāo),左上角(0,0),右下角(1920,1080 - 以實(shí)際屏幕為準(zhǔn))
* [in] endPoint: 結(jié)束坐標(biāo),左上角(0,0),右下角(1920,1080 - 以實(shí)際屏幕為準(zhǔn))
* [out] points: 軌跡數(shù)組,如果數(shù)組中元素 point 出現(xiàn)(-1,-1),表示鼠標(biāo)軌跡結(jié)束
*
* 返回值:返回參數(shù)SN_RESULT.code(錯(cuò)誤碼)如果為 0 表示成功,否則表示錯(cuò)誤號(hào);
*
*/
 
SN_RESULT WINAPI apiSNMouseMove(HANDLE handle, SN_POINT startPoint, SN_POINT endPoint, SN_POINT_PARAMS* points);
 
/*獲取版本號(hào)
*
* 參數(shù):
* [in] handle: 句柄(通過調(diào)用apiSNCreateHandle得到)
* [out] szVersion: 版本號(hào)
*
* 返回值:返回參數(shù)SN_RESULT.code(錯(cuò)誤碼)如果為 0 表示成功,否則表示錯(cuò)誤號(hào);
*
*/
 
SN_RESULT WINAPI apiSNGetVersion(HANDLE handle, char* szVersion);
 
/*獲取錯(cuò)誤信息
*
* 參數(shù):
* [in] handle: 句柄(通過調(diào)用apiSNCreateHandle得到)
*
* 返回值:返回參數(shù)SN_RESULT.code(錯(cuò)誤碼)如果為 0 表示成功,否則表示錯(cuò)誤號(hào);
*
*/
 
SN_RESULT WINAPI apiSNGetError(HANDLE handle);
 
/*釋放句柄(內(nèi)存)
*
* 參數(shù):
* [in] handle: 句柄(通過調(diào)用apiSNCreateHandle得到)
*
* 返回值:返回參數(shù)SN_RESULT.code(錯(cuò)誤碼)如果為 0 表示成功,否則表示錯(cuò)誤號(hào);
*
*/
 
SN_RESULT WINAPI apiSNDestroyHandle(HANDLE handle);
 
#endif // !_SN_SDK_H__

2.其他編程語言

為了易于集成和使用,我們將鼠標(biāo)軌跡算法封裝為DLL(動(dòng)態(tài)鏈接庫)。這種封裝方式不僅保留了算法的性能優(yōu)勢,還提供了跨平臺(tái)和跨語言的兼容性,目前支持編程語言如下:

  • C++
  • Python
  • 易語言

推算軌跡算法耗時(shí)均為毫秒級(jí),<= 5ms ,速度超快,fps類型游戲完全無壓力!

3.鼠標(biāo)軌跡API調(diào)用流程圖

QQ截圖20241103105733.jpg

注意:如果是多線程,每個(gè)線程都需要通過apiSNCreateHandle創(chuàng)建HANDLE句柄,這樣才能多個(gè)線程互不影響

4.C++鼠標(biāo)軌跡接口

/****************************************************************************************/
 
@SDK功能描述:鼠標(biāo)軌跡
/******************************************************************************************/
//
 
#include <iostream>
#include "include/SNSDK.h"
#pragma comment(lib,"./dll/x86/SNSDK.lib")
 
int main()
{
    SN_RESULT pResult = { 0 };
    
    char* pKey = (char*)"SNKJaURwbfuhcaQaCMJVhdByPZMVsZdqRUMjfWrxY1A5";
    //1.創(chuàng)建句柄
    HANDLE pHandle = apiSNCreateHandle(pKey,&pResult);
    if (!pHandle)
    {
        printf("error code:%d message:%s \n",pResult.code,pResult.message);
        return -__LINE__;
    }
 
    //2.獲取軌跡
    SN_POINT startPoint = { 100,100 };  //開始坐標(biāo)
    SN_POINT endPoint = { 800,800 };    //結(jié)束坐標(biāo)
    SN_POINT_PARAMS track[4096] = { 0 };//軌跡
    pResult = apiSNMouseMove(pHandle, startPoint, endPoint, track);
  if (pResult.code != 0)
  {
    printf("error code:%d message:%s \n", pResult.code, pResult.message);
    return -__LINE__;
  }
 
  //3.鼠標(biāo)根據(jù)軌跡移動(dòng),軌跡最后一個(gè)點(diǎn)(-1,-1)
  for (int i = 0; i < 4096; i++)
  {
    struct SN_POINT point = track[i].point;
    if (point.x <= 0 && point.y <= 0)//軌跡最后一個(gè)點(diǎn)(-1,-1)
      break;
        printf("x:%d y:%d delay_time:%d \n", point.x, point.y, track[i].delayTime);
  }
 
    //4.釋放內(nèi)存
    pResult = apiSNDestroyHandle(pHandle);
    return 1;
}
 
 
/*
x:100 y:100 delay_time:0
x:100 y:98 delay_time:10
x:103 y:98 delay_time:15
x:111 y:98 delay_time:16
x:116 y:101 delay_time:15
x:122 y:104 delay_time:2
x:129 y:107 delay_time:13
x:135 y:109 delay_time:2
x:144 y:112 delay_time:14
x:155 y:117 delay_time:2
x:167 y:123 delay_time:14
x:180 y:128 delay_time:2
x:193 y:134 delay_time:13
x:209 y:138 delay_time:2
x:225 y:144 delay_time:13
x:238 y:149 delay_time:5
x:254 y:157 delay_time:10
x:269 y:162 delay_time:5
x:282 y:168 delay_time:11
x:298 y:175 delay_time:5
x:311 y:180 delay_time:10
x:326 y:185 delay_time:6
x:341 y:193 delay_time:9
x:369 y:211 delay_time:15
x:396 y:231 delay_time:16
x:419 y:251 delay_time:16
x:442 y:270 delay_time:16
x:461 y:285 delay_time:17
x:481 y:300 delay_time:15
x:491 y:311 delay_time:15
x:502 y:319 delay_time:2
x:513 y:329 delay_time:14
x:523 y:343 delay_time:2
x:535 y:355 delay_time:14
x:546 y:369 delay_time:0
x:558 y:383 delay_time:15
x:570 y:397 delay_time:2
x:582 y:411 delay_time:13
x:596 y:427 delay_time:2
x:608 y:443 delay_time:14
x:620 y:459 delay_time:5
x:633 y:476 delay_time:10
x:645 y:490 delay_time:5
x:656 y:503 delay_time:11
x:666 y:515 delay_time:5
x:675 y:527 delay_time:11
x:684 y:538 delay_time:5
x:694 y:551 delay_time:11
x:702 y:565 delay_time:5
x:710 y:577 delay_time:11
x:716 y:588 delay_time:5
x:723 y:598 delay_time:11
x:728 y:606 delay_time:5
x:733 y:615 delay_time:11
x:738 y:622 delay_time:5
x:743 y:631 delay_time:11
x:747 y:637 delay_time:5
x:750 y:644 delay_time:11
x:753 y:652 delay_time:5
x:756 y:659 delay_time:10
x:759 y:666 delay_time:5
x:761 y:673 delay_time:11
x:764 y:680 delay_time:5
x:766 y:687 delay_time:11
x:768 y:694 delay_time:5
x:769 y:701 delay_time:10
x:771 y:708 delay_time:5
x:772 y:714 delay_time:11
x:773 y:722 delay_time:5
x:774 y:729 delay_time:10
x:777 y:743 delay_time:16
x:778 y:755 delay_time:15
x:778 y:764 delay_time:16
x:780 y:775 delay_time:16
x:781 y:784 delay_time:16
x:781 y:785 delay_time:15
x:781 y:789 delay_time:2
x:781 y:790 delay_time:13
x:781 y:792 delay_time:2
x:782 y:796 delay_time:14
x:782 y:796 delay_time:2
x:782 y:797 delay_time:14
x:782 y:798 delay_time:15
x:782 y:800 delay_time:311
x:784 y:800 delay_time:16
x:784 y:800 delay_time:5
x:785 y:800 delay_time:10
x:786 y:800 delay_time:5
x:786 y:800 delay_time:11
x:788 y:800 delay_time:6
x:789 y:800 delay_time:9
x:790 y:800 delay_time:5
x:791 y:800 delay_time:10
x:793 y:800 delay_time:16
x:795 y:800 delay_time:16
x:796 y:800 delay_time:15
x:797 y:800 delay_time:15
x:797 y:800 delay_time:2
x:798 y:800 delay_time:15
x:798 y:800 delay_time:30
x:799 y:800 delay_time:15
x:799 y:800 delay_time:15
*/
————————————————

5.云盤源碼下載

云盤目錄介紹:
demo - 包含各種編程語言的demo
dll - 分別是x86和x64平臺(tái)所需要的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)用流程圖》,多線程和單線程類似;如果是多線程,那么每個(gè)線程都需要通過apiSNCreateHandle創(chuàng)建HANDLE句柄,這樣才能多個(gè)線程互不影響

六.更新日志

  • 2024.09.28 新增易語言demo
  • 2024.09.21 修復(fù)部分水平/垂直軌跡出現(xiàn)負(fù)數(shù)的情況
  • 2024.09.19 優(yōu)化部分軌跡延遲時(shí)間為0的情況(可能會(huì)造成鼠標(biāo)瞬移)
  • 2024.08.20 優(yōu)化部分軌跡可能出現(xiàn)負(fù)數(shù)的問題
  • 2024.07.15 優(yōu)化水平/垂直軌跡
  • 2024.06.25 新增錯(cuò)誤日志信息
  • 2024.06.06 python 模擬人工鼠標(biāo)軌跡demo
  • 2024.02.06 c++ 模擬人工鼠標(biāo)軌跡demo
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容