我在制作可注射的记事本文本查看器时遇到问题。我想我可能错误地访问了hwndEdit HWND。目前,当我运行该程序时,它显示
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
作为文字
#include <stdio.h>
#include <iostream>
#include <string>
#include <Windows.h>
int main() {
AllocConsole();
SetConsoleTitleA("Notepad Viewer");
FILE *c;
freopen_s(&c, "CONOUT$", "w", stdout);
freopen_s(&c, "CONIN$", "r", stdin);
DWORD hwndEditAddress = 0x41E1B4;
HWND hwndEdit = *(HWND*)&hwndEditAddress;
for (;;) {
TCHAR text[256];
SendMessage(hwndEdit, WM_GETTEXT, sizeof(text) / sizeof(text[0]), LPARAM(text));
std::cout << "Current Text: " << text;
std::string input;
std::getline(std::cin, input);
}
}
答案 0 :(得分:1)
╠
对应于(扩展的)ASCII代码204,其为十六进制的0xCC
。 Visual C ++ CRT使用一系列0xCC
字节来标记未初始化的内存。因此,您的输出基本上是一些未初始化的内存区域的转储。
在您的代码中,您调用SendMessge
传递hwndEdit
句柄;但是你用来初始化这个句柄的逻辑还不清楚并且有臭味:
DWORD hwndEditAddress = 0x41E1B4; HWND hwndEdit = *(HWND*)&hwndEditAddress;
答案 1 :(得分:-1)
这段代码很奇怪
DWORD hwndEditAddress = 0x41E1B4;
HWND hwndEdit = *(HWND*)&hwndEditAddress;
你也可以写
HWND hwndEdit = (HWND)0x41E1B4;
具有完全相同的效果。
接下来发生的是该值不是窗口句柄的值。因此,尝试读取文本失败,text
永远不会被修改。最后,打印一个未初始化的字符数组,这是未定义的行为。
您需要重新访问获取窗口句柄的逻辑。