我刚刚编写了一个小程序,它应该从窗口中的编辑框中读取3个值(窗口名称,基址,值)。使用窗口名称和WriteProcessMemory()
中的值有效,但基址不起作用。
TCHAR windowName[100];
int baseAddress;
int replaceValue;
HWND window;
DWORD procId;
HANDLE proc;
GetDlgItemText(hwnd, 1, windowName, 100); // works correctly
replaceValue = GetDlgItemInt(hwnd, 3, NULL, TRUE); // works also
baseAddress = GetDlgItemInt(hwnd, 2, NULL, TRUE); // doesn't get the right int when input is hex
window = FindWindow(NULL, windowName);
GetWIndowThreadProcessId(window, &procId);
proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procId);
WriteProcessMemory(proc, (LPVOID)baseAddress, &replaceValue, sizeof(replaveValue), NULL); // works when baseAddress is dec
CloseHandle(proc);
总而言之,当baseAddress为十六进制时,它不起作用。
答案 0 :(得分:1)
我只需使用GetDlgItemText
获取控件的文本,然后使用C标准库中的另一个函数int
将其转换为strtol
;只需要支持多个碱基进行文本到整数转换的任何内容。 http://www.cplusplus.com/reference/cstdlib/strtol/
答案 1 :(得分:0)
文档说明了我的重点:
GetDlgItemInt函数通过向控件发送WM_GETTEXT消息来检索指定控件的文本。该函数通过剥离文本开头的任何多余空格然后转换十进制数字来转换检索到的文本。该函数在到达文本末尾或遇到非数字字符时停止转换。
此函数将指定窗口中的文本解释为十进制。
如果您希望将其解释为十六进制,那么您必须自己编写代码。使用GetDlgItemText
检索文本。然后使用转换函数将其转换为整数,该函数将文本解释为十六进制。