2009-07-04 3 views
1

Я пытался выбрать элемент во внешнем списке, но, похоже, работает только с списками, которые принимают несколько выбранных элементов:Как выбрать элемент в списке, который разрешает только один выбранный элемент за один раз

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); 

ответ

1

Ваш код выглядит действительным и должен работать, я тестировал его внутри моего собственного приложения GUI, поэтому, возможно, проблема заключается в вашей попытке получить доступ из-за пределов фактического процесса. Я замечаю, что вы жестко закодировали HWND для ListView. Также я буду осторожен с тем, что вы сразу же освободите виртуальную память после отправки сообщения. Помните, что отправленное сообщение будет опубликовано (при условии, что HWND является правильным) для насоса сообщений ListView. Его можно не позаботиться немедленно, и к тому времени, когда это так, есть приличный шанс, что вы уже выпустили память о LVITEM. Попробуйте это внутри GUI, убедитесь, что у вас это работает, тогда я бы предложил вернуться к этому подходу и установить соответствующие точки отладки (в графическом интерфейсе, если это чужой, сделать свой собственный простой диалог с listView), чтобы сделать убедитесь, что сообщение получено надлежащим образом и что память действительна.

Смежные вопросы