2009-07-04 13 views
1

zu einem Zeitpunkt nur ein ausgewähltes Element erlaubt Ich habe versucht, ein Element auf einem externen Listenansicht zu wählen, aber es scheint nur mit Listviews zu arbeiten, die mehrere ausgewählte Elemente akzeptieren:Wie ein Element in einer Listenansicht auszuwählen, die

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

Antwort

1

Ihr Code sieht gültig aus, und sollte funktionieren, ich habe es intern innerhalb meiner eigenen GUI-Anwendung selbst getestet, also ist das Problem in Ihrem Versuch, von außerhalb des tatsächlichen Prozesses zuzugreifen. Ich bemerke, dass Sie den HWND für den ListView hart codiert haben. Auch würde ich mit der Tatsache vorsichtig sein, dass Sie den virtuellen Speicher sofort freigeben, nachdem Sie die Nachricht gesendet haben. Denken Sie daran, dass die gesendete Nachricht an die ListView-Nachrichtenpumpe gesendet wird (vorausgesetzt, der HWND ist korrekt). Es kann nicht sofort erledigt werden und zu dem Zeitpunkt, an dem es ist, gibt es eine gute Chance, dass Sie bereits die Erinnerung an das LVITEM freigegeben haben. Probieren Sie es intern in der GUI aus, stellen Sie sicher, dass das funktioniert, dann würde ich vorschlagen, zu diesem Ansatz zurückzukehren und geeignete Debug-Punkte zu setzen (innerhalb der GUI, wenn dies jemand anderes ist, machen Sie Ihren eigenen einfachen Dialog mit einer ListView) Stellen Sie sicher, dass die Nachricht ordnungsgemäß empfangen wird und der Speicher gültig ist.

Verwandte Themen