tibiaWindow = FindWindow( L"TibiaClient", NULL);

    DWORD PID;
    GetWindowThreadProcessId( tibiaWindow, &PID );

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); //Open Process for Read/Write
    short mana = 0;
    void* ptr = (void*)hProcess+0x3C2D00;
    if( !ReadProcessMemory(hProcess, ptr, &mana, 2, 0) ){
        return false;
    }
    else{
        statusBar()->showMessage( QString::number(mana), 3000 );
    }

    return true;


这应该从位于tibia.exe + 0x3CD2D00的游戏中读取法力值。但这是行不通的。谁能帮我?如何获得该窗口的基地址?

最佳答案

要在另一个进程中获取模块的基地址,需要两个步骤:


使用EnumProcessModules检索加载到进程中的所有模块句柄。
遍历模块句柄列表,并使用GetModuleFileNameExGetModuleBaseName查询模块名称,直到找到匹配项。


您从第2步中获得的模块句柄是查询进程的地址空间中模块的基地址。

您发布的偏移量(0x3CD2D00)可能不属于实际图像tibia.exe。这意味着该模块的大小至少为63MB,听起来不正确。它可能驻留在其他模块的静态数据中,也可能驻留在堆内存中,从而使您提出的方法无用。

10-02 06:52