Как выбрать элемент в listview, который допускает только 1 выбранный элемент одновременно
Вопрос
Я пытался выбрать элемент во внешнем listview, но, похоже, он работает только с listviews, которые принимают несколько выбранных элементов:
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);
Решение
Ваш код выглядит корректным и должен работать, я протестировал его внутри моего собственного приложения с графическим интерфейсом, так что, возможно, проблема заключается в вашей попытке получить доступ извне реального процесса.Я заметил, что вы жестко закодировали HWND для ListView.Также я был бы осторожен с тем фактом, что вы немедленно освобождаете виртуальную память после отправки сообщения.Помните, что отправленное сообщение будет отправлено (при условии, что HWND правильный) в перекачку сообщений ListView.Возможно, об этом позаботятся не сразу, и к тому времени, когда это произойдет, есть приличная вероятность, что вы уже освободили память LVITEM.Попробуйте это внутренне в графическом интерфейсе, убедитесь, что у вас это работает, затем я бы предложил вернуться к этому подходу и установить соответствующие точки отладки (в графическом интерфейсе, если это кто-то другой, создайте свой собственный простой диалог с ListView), чтобы убедиться, что сообщение принимается надлежащим образом и что память действительна.