Como selecionar um item em um listview que permite apenas 1 item selecionado em um momento

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

  •  22-08-2019
  •  | 
  •  

Pergunta

Eu tenho tentado para selecionar um item em um listview externo, mas parece funcionar apenas com listviews que aceitam vários itens selecionados:

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);
Foi útil?

Solução

Seu código parece válido, e deve funcionar, eu testei internamente dentro do meu próprio próprio aplicativo GUI, então talvez o problema está em sua tentativa de acesso a partir do exterior do processo real. Eu noto que você codificado o HWND para o ListView. Também gostaria de ter cuidado com o fato de que você solte imediatamente a memória virtual após o envio da mensagem. Lembre-se que a mensagem enviada vai ser postado (assumindo que o HWND está correto) para a bomba mensagem ListView. Não pode ser tomado cuidado de imediato e pelo tempo que for, há uma boa chance que você já tenha lançado a memória do LVITEM. Experimente internamente dentro do GUI, certifique-se que você tem que trabalhar, então eu sugiro que voltar a esta abordagem e definir pontos de depuração apropriados (dentro do GUI, se este é de outra pessoa, fazer o seu próprio diálogo simples com um listView) para fazer Certifique-se de que a mensagem está sendo recebida de forma adequada, e que a memória é válido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top