C++ 如何在一次仅允许1个选定项目的listview中选择项目

C++ 如何在一次仅允许1个选定项目的listview中选择项目,c++,listview,select,external,C++,Listview,Select,External,我一直在尝试在外部listview上选择一个项目,但它似乎只适用于接受多个选定项目的listview: 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(L

我一直在尝试在外部listview上选择一个项目,但它似乎只适用于接受多个选定项目的listview:

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应用程序内部对其进行了测试,所以问题可能在于您试图从实际流程之外进行访问。我注意到您已经为ListView硬编码了HWND。另外,我会注意这样一个事实,即在发送消息后立即释放虚拟内存。请记住,发送的消息将被发布(假设HWND正确)到ListView消息泵。它可能不会被立即处理,到它被处理的时候,很有可能你已经释放了LVITEM的内存。在GUI内部尝试一下,确保它正常工作,然后我建议回到这种方法,并设置适当的调试点(在GUI中,如果这是其他人的,则使用listView创建自己的简单对话框),以确保消息被正确接收,并且内存是有效的。

您的代码看起来有效,应该可以工作,我已经在自己的GUI应用程序中对其进行了内部测试,因此问题可能在于您试图从实际进程之外进行访问。我注意到您已经为ListView硬编码了HWND。另外,我会注意这样一个事实,即在发送消息后立即释放虚拟内存。请记住,发送的消息将被发布(假设HWND正确)到ListView消息泵。它可能不会被立即处理,到它被处理的时候,很有可能你已经释放了LVITEM的内存。在GUI内部尝试一下,确保它能正常工作,然后我建议回到这种方法,并设置适当的调试点(在GUI中,如果这是其他人的,则使用listView创建自己的简单对话框),以确保消息被正确接收,并且内存有效