从另一个应用程序读取状态栏

Reading statusbar from another application

本文关键字:状态栏 读取 应用程序 另一个      更新时间:2023-10-16

我正在尝试从另一个包含多个面板的应用程序的状态栏中读取文本。我该怎么做。我尝试在其他应用程序中分配内存并基于此读取该缓冲区:

http://www.codeproject.com/Articles/5570/Stealing-Program-s-Memory

我当前的代码是:

GetWindowThreadProcessId(grxstatusbar, &statusbarpid);
statusbarprocess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, statusbarpid);
char* _buffer = nullptr;
char buffer[20];
_buffer = (char*)VirtualAllocEx(statusbarprocess, NULL, 20, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(statusbarprocess, _buffer, &buffer, 20, NULL);
SendMessage(grxstatusbar, SB_GETTEXT, (WPARAM)0, (LPARAM)_buffer);
ReadProcessMemory(statusbarprocess, _buffer, buffer, 20, NULL);
VirtualFreeEx(statusbarprocess, _buffer, 0, MEM_RELEASE);

但是,缓冲区总是只是胡言乱语。解决这个问题的最佳方法是什么。

编辑 *****

如果目标窗口是 UNICODE,这将不起作用。您可以使用SB_GETTEXTLENGTH来查找文本长度。使用 UNICODE 版本:

int char_count;
char_count = SendMessageW(hwndTarget, SB_GETTEXTLENGTH, 1, 0);
if (char_count <= 0)
    return 0;
char_count = LOWORD(char_count) + 1;
int datalen = LOWORD(char_count);
datalen *= sizeof(wchar_t);
void* data = VirtualAllocEx(hprocess, NULL, datalen, 
    MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
SendMessageW(hwndTarget, SB_GETTEXT, 1, (LPARAM)data);
wchar_t *buf = new wchar_t[char_count];
if (ReadProcessMemory(hprocess, data, buf, datalen, 0))
    std::wcout << "buf: " << buf << "n";
delete[]buf;
VirtualFreeEx(hprocess, data, 0, MEM_RELEASE);
CloseHandle(hprocess);