zoukankan      html  css  js  c++  java
  • 游戏外挂最基本的按键模拟

      玩魔兽世界的时候,很多小号找大号带副本升级。台服在客户端不活动的情况下会强迫用户下线,导致尽管小号无事可做,还要在屏幕下等待。于是自己开发一个程序,让游戏角色保持活动,不至于下线。

    代码
    ///本程序僅僅監控台服WOW程序,挂機刷經驗(如破碎)保持角色與服務器互動。
    ///程序模擬鍵盤操作,每隔指定的時間模擬按空格,讓角色跳躍以防被踢。


    //---------------------------------------------------------------------------
    #include <windows.h>
    #define ID_TIMER 1
    #define TIMER_ELAPSE 5000    //角色跳跳時間間隔
    //---------------------------------------------------------------------------
    HWND hWnd;
    LPCTSTR ClsName 
    = L"WOW_JUMPER";
    LPCTSTR WindowCaption 
    = L"魔獸世界台服破碎挂機跳跳虎";
    LPCTSTR WOW_CLASSNAME 
    = L"GxWindowClassD3d";
    LPCTSTR WOW_CAPTION 
    = L"魔獸世界";
    //HWND hwndWoW = FindWindow(TEXT("GxWindowClassD3d"),TEXT("魔獸世界"));

    LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

    HWND hwndWoW, hwndJumper;
    DWORD dwThreadIDWoW, dwThreadIDJumper;
    BOOL bOK;
    int lResult;

    //---------------------------------------------------------------------------
    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, 
    int nCmdShow)
    {
        MSG         Msg;
        WNDCLASSEX  WndClsEx;

        WndClsEx.cbSize        
    = sizeof(WNDCLASSEX);
        WndClsEx.style         
    = CS_HREDRAW | CS_VREDRAW;
        WndClsEx.lpfnWndProc   
    = WndProc;
        WndClsEx.cbClsExtra    
    = NULL;
        WndClsEx.cbWndExtra    
    = NULL;
        WndClsEx.hInstance     
    = hInstance;
        WndClsEx.hIcon         
    = LoadIcon(NULL, IDI_APPLICATION);
        WndClsEx.hCursor       
    = LoadCursor(NULL, IDC_ARROW);
        WndClsEx.hbrBackground 
    = (HBRUSH)GetStockObject(WHITE_BRUSH);
        WndClsEx.lpszMenuName  
    = NULL;
        WndClsEx.lpszClassName 
    = ClsName;
        WndClsEx.hIconSm       
    = LoadIcon(NULL, IDI_APPLICATION);

        RegisterClassEx(
    &WndClsEx);

        hWnd 
    = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, ClsName, WindowCaption,WS_OVERLAPPEDWINDOW,
            
    100,120,320,240,
            NULL, NULL, hInstance, NULL);

        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);

        
    while( GetMessage(&Msg, NULL, 00) )
        {
            TranslateMessage(
    &Msg);
            DispatchMessage(
    &Msg);
        }

        
    return Msg.wParam;
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
        
    switch(Msg)
        {
        
    case WM_CREATE:
            
    //HWND hwndWoW = FindWindow(TEXT("GxWindowClassD3d"),TEXT("魔獸世界"));
            hwndWoW = FindWindow(WOW_CLASSNAME , WOW_CAPTION );
            dwThreadIDWoW 
    = GetWindowThreadProcessId(hwndWoW,NULL);

            hwndJumper 
    = GetForegroundWindow();
            dwThreadIDJumper 
    = GetWindowThreadProcessId(hwndJumper,NULL);

            bOK 
    = AttachThreadInput(dwThreadIDJumper, dwThreadIDWoW,TRUE);

            
    if(bOK)//在獲得魔獸程序句柄級線程,並與本程序線程成功綁定後,方可啟動定時器。
            {
                SetTimer(hWnd,ID_TIMER,TIMER_ELAPSE,NULL);
            }
            
    else
            {
                MessageBox(NULL,TEXT(
    "魔獸世界主程序未找到,請先運行WOW後再運行本程序。"),TEXT("監控程序已關閉"),0x40);        
                SendMessage(hWnd,WM_CLOSE,
    0,0);
                
    return 0;
            }
            
    break;

        
    case WM_ACTIVATE:
            bOK 
    = SetWindowPos(hWnd,HWND_TOPMOST ,100,120,320,240,SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);
            
    break;
        
    case WM_TIMER:
            hwndWoW 
    = FindWindow(WOW_CLASSNAME , WOW_CAPTION );
            
    if(hwndWoW == NULL)//監控程序已經終止,則退出本程序。
            {
                SendMessage(hWnd,WM_CLOSE,
    0,0);        
                
    return 0;
            }
            bOK 
    = SetForegroundWindow(hwndWoW);//保證激活WOW程序,100毫秒後主窗體應該能顯示;然後模擬空格鍵按下抬起
            Sleep(100);
            keybd_event(VK_SPACE,
    0,0,0);
            Sleep(
    10); 
            keybd_event(VK_SPACE,
    0, KEYEVENTF_KEYUP,0);  
            
    break;
        
    case WM_DESTROY:
            KillTimer(hWnd,ID_TIMER);
            bOK 
    = AttachThreadInput(dwThreadIDJumper, dwThreadIDWoW,FALSE);        
            PostQuitMessage(WM_QUIT);
            
    break;
        
    default:
            
    return DefWindowProc(hWnd, Msg, wParam, lParam);
        }
        
    return 0;
    }
    //---------------------------------------------------------------------------


  • 相关阅读:
    现代操作系统读书笔记 2
    java8 中 ImageIO 读取 tiff 格式的图片失败
    word 转 pdf,c#代码
    spring 技术内幕读书笔记1
    操作系统精髓与设计读书笔记1
    手把手教你WEB套打程序开发
    WEB打印控件Lodop使用体会
    listview下拉刷新 上拉(滑动分页)加载更多
    如何解析android访问webservice返回的SoapObject数据(可用)
    统计子串在另一个字符中出现的次数
  • 原文地址:https://www.cnblogs.com/flaaash/p/1895111.html
Copyright © 2011-2022 走看看