gpt4 book ai didi

c++ - 设置另一个程序的 ListView 选择项

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:32 26 4
gpt4 key购买 nike

我希望能够选择在另一个程序的 ListView 中选择的项目(我无权访问其代码)。实际上,它是一个 SysListView32,我认为它是相同的。我已经有了以下代码,不幸的是,尽管进行了编译,但它似乎什么也没做(尽管 SendMessage() 返回 1)。

process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, 0xD14); 

_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);

lvi.state = LVIS_SELECTED | LVIS_FOCUSED;
lvi.stateMask = LVIS_SELECTED | LVIS_FOCUSED;

WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
int abc = ::SendMessage((HWND)0x00050D30, LVM_SETITEMSTATE, (WPARAM)2, (LPARAM)_lvi);
VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);

最佳答案

下面的代码对我来说就像一个魅力:

HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, 0x0000c130);
LPVOID epLvi = VirtualAllocEx(hProcess, NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

LVITEM lvi;
lvi.state = LVIS_FOCUSED | LVIS_SELECTED;
lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
SIZE_T cbWritten = 0;
WriteProcessMemory(hProcess, epLvi, &lvi, sizeof(lvi), &cbWritten);
DWORD dw = SendMessage((HWND)0x00020C4C, LVM_SETITEMSTATE, 1, (LPARAM)epLvi);

VirtualFreeEx(hProcess, epLvi, 4096, MEM_DECOMMIT | MEM_RELEASE);
CloseHandle(hProcess);

您的代码可能无法运行的原因有多种:

  • 正如 Michael Dunn 提到的,您需要保留和提交地址空间。有趣的是,您的示例仅尝试MEM_COMMIT 内存,然后MEM_RELEASE 内存(与MEM_RESERVE 相反);
  • 您可能没有足够的权限访问拥有该窗口的进程;
  • 您的流程和目标流程的位数可能不同。在这种情况下可能需要一些结构大小技巧。

如果这些都不起作用,我建议您尝试不同的方法:IAccessible在这里可能会有帮助。这里通常的免责声明:与其他进程窗口和地址空间混淆需要谨慎的方法,应尽可能避免。

关于c++ - 设置另一个程序的 ListView 选择项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/976308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com