我一直在试图选择在外部列表视图中的项目,但它似乎只与接受多项选择的列表视图工作:

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

LVITEM lvi;

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

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

 WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); 
 int abc = ::SendMessage((HWND)0x00080D6A, LVM_SETITEMSTATE, (WPARAM)0, (LPARAM)_lvi); 
 VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
有帮助吗?

解决方案

您的代码看起来有效,并且应该工作,我自己的GUI应用程序本身的内部测试,所以也许这个问题在您尝试从实际过程之外的访问。我注意到你有硬编码的HWND为ListView。我也很小心,你立即发送消息之后释放虚拟内存的事实。请记住,发送的邮件将被公布(假设HWND是正确的)到ListView消息泵。它可能不会立刻受到精心护理,并通过它的时候,有你已经发布的LVITEM的内存像样的机会。试试吧内部的GUI中,请确保你有工作,那么我建议要回这一做法,并制定相应的调试点(GUI内,如果这是别人的,自己制作简单的对话框,其中一个ListView),使确定正在接收的消息适当地,并且该存储器是有效的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top