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的游戏中读取法术力。但它不起作用。谁能帮我?如何获取该窗口的基址?
答案 0 :(得分:5)
要在另一个进程中获取模块的基址,需要两个步骤:
EnumProcessModules
检索加载到流程中的所有模块句柄。GetModuleFileNameEx
或GetModuleBaseName
迭代模块句柄列表并查询模块名称,直至找到匹配项。从步骤2获得的模块句柄是查询进程的地址空间中模块的基址。
您发布的偏移量(0x3CD2D00
)可能不属于实际图片tibia.exe
。这意味着该模块的大小至少为63MB,听起来不对。它可能驻留在某些其他模块的静态数据中,或者可能存在于堆内存中,这使得您提出的方法无用。