该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@森林歌唱家 最后个方法是跨进程读写内存常用方式 这里只对标准listctrl listview有效
LVITEM lvitem, *plvitem;
NMHDR nmhdr,*pnmhdr;
HANDLE hProcess;
DWORD PID;
EnableDebugPrivilege(hProcess);
GetWindowThreadProcessId(g_List1, &PID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
if (hProcess) {
DWORD dwOldProtect;
plvitem=(LVITEM*)VirtualAllocEx(hProcess,NULL, sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
lvitem.state=LVIS_SELECTED|LVIS_FOCUSED|LVIS_ACTIVATING;
lvitem.stateMask=LVIS_SELECTED;
VirtualProtectEx(hProcess, plvitem, sizeof(LVITEM), PAGE_READWRITE, &dwOldProtect);
WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
VirtualProtectEx(hProcess, plvitem, sizeof(LVITEM), dwOldProtect, &dwOldProtect);
::SendMessage(g_List1,LVM_SETITEMSTATE,(WPARAM)0,(LPARAM)plvitem);
pnmhdr = (NMHDR*)VirtualAllocEx(hProcess,NULL, sizeof(NMHDR),MEM_COMMIT,PAGE_READWRITE);
nmhdr.code = NM_RCLICK;
nmhdr.hwndFrom = g_List1; List控件HWND
nmhdr.idFrom = 0x4B3; List控件ID
VirtualProtectEx(hProcess, pnmhdr, sizeof(NMHDR), PAGE_READWRITE, &dwOldProtect);
WriteProcessMemory(hProcess, pnmhdr, &nmhdr, sizeof(NMHDR), NULL);
VirtualProtectEx(hProcess, pnmhdr, sizeof(NMHDR), dwOldProtect, &dwOldProtect);
::PostMessage(::GetParent(g_List1),WM_NOTIFY,(WPARAM)0x4B3,(LPARAM)pnmhdr);
}