Как выбрать элемент в listview, который допускает только 1 выбранный элемент одновременно

StackOverflow https://stackoverflow.com/questions/1081979

  •  22-08-2019
  •  | 
  •  

Вопрос

Я пытался выбрать элемент во внешнем 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), чтобы убедиться, что сообщение принимается надлежащим образом и что память действительна.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top