从另一个应用程序读取状态栏
Reading statusbar from another application
我正在尝试从另一个包含多个面板的应用程序的状态栏中读取文本。我该怎么做。我尝试在其他应用程序中分配内存并基于此读取该缓冲区:
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);
相关文章:
- 如何在cocos-2dx中隐藏ios13中的状态栏
- Sublime Text 3 在我尝试编译C++代码时在状态栏上显示"No Build System"。为什么?
- 如何在浮点状态下隐藏 CDockablePane 中的标题栏
- 如何在Windows C MFC应用程序状态栏中禁用CAP NUM SCRL指示器
- Arduino Trinket/Attiny85 USB:可以读取所有按键的状态
- 在状态栏上显示来自不同线程中回调的消息
- 为什么这个状态栏输出乱码的中文样字符
- 使用win32监视Windows任务栏状态更改
- 显示状态栏默认消息
- 在子进程处于活动状态时读取子进程的输出
- 将图标添加到状态栏 - Qt
- Qt在状态栏中显示不断更新的百分比
- 从另一个应用程序读取状态栏
- 使用 SB_SETTEXT 的状态栏中显示的字符数是否有限制
- 尺寸手柄从MacOSX上的Qt 5.1的状态栏中消失了
- 如何定位OPENGL顶部的状态栏
- 如果你的程序在运行时几乎立即退出,如何确保控制台窗口保持打开状态以读取输出
- 为c++控制台应用程序添加状态栏
- MFC状态栏-使文本与按钮行为的链接
- WinApi和c++ -状态栏不更新