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
检索加载到进程中的所有模块句柄。
遍历模块句柄列表,并使用GetModuleFileNameEx
或GetModuleBaseName
查询模块名称,直到找到匹配项。
您从第2步中获得的模块句柄是查询进程的地址空间中模块的基地址。
您发布的偏移量(0x3CD2D00
)可能不属于实际图像tibia.exe
。这意味着该模块的大小至少为63MB,听起来不正确。它可能驻留在其他模块的静态数据中,也可能驻留在堆内存中,从而使您提出的方法无用。