SysListView32 - select item



  • Hallo Leute,

    ich habe ein Problem beim Auswählen einer Zeile einer ListView Form. Ich habe einige Befehle gefunden, doch mit keinem konnte ich eine Zeile markieren...

    Bei meiner Suche habe ich das hier gefunden:

    //selectieren
    ListView_SetItemState(hWndLV, nIndex, LVIS_SELECTED, LVIS_SELECTED);
    
    //deselectieren
    ListView_SetItemState(hWndLV, nIndex, 0, LVIS_SELECTED);
    

    Leider funktioniert das bei mir nicht. Für kurze Zeit hatte es beim MediaPlayer funktioniert, doch jetzt geht es dort auch nicht mehr 😕

    Ich habe gesehen, dass es bei meinem Taskmanager (Anwendungs/Prozessansicht...) ebenfalls nicht funktioniert. Falls es von eurer Seite Lösungsvorschläge gibt, wäre es gut, wenn es zumindest im Taskmanager funktioniert, da die ListView dem in meinem Programm ähnelt.

    Für den Fall, dass es wichtig ist: Betriebssystem ist Win7 32Bit

    Gruß, Waschbär



  • Nachtrag:

    Nach einem Neustart funktioniert nun immerhin das selectieren sowohl im MediaPlayer als auch im Taskmanager.
    Deselectieren geht weiterhin nicht... Und nach einem LVIS_FOCUSED bekomme ich den Focus nicht mal mehr mit der Maus weg -.-'



  • Hmm, scheint nur bei mir ein Problem zu sein... Nun ja, für den Fall, dass noch andere auf ähnliche Probleme stoßen, hier mein Weg:

    // aktivieren und selectieren der Form mit der linken Maustaste
    SendMessage(listview, WM_MOUSEACTIVATE, (WPARAM)parent, (LPARAM)((WM_LBUTTONDOWN<<16)+HTCLIENT));
    SendMessage(listview, WM_SETCURSOR, (WPARAM)parent, (LPARAM)((WM_LBUTTONDOWN<<16)+HTCLIENT));
    
    // mit der linken Maustaste auf den ersten Eintrag (Pixel (10|10) klicken
    PostMessage(listview, WM_LBUTTONDOWN, 0, (LPARAM)(10<<16)+(10));
    

    In den paar Zeilen klicke ich nur den ersten Eintrag an. Ich hatte versucht, mit LVM_GETITEMRECT die Koordinaten der anderen Einträge herauszubekommen, doch auch da hat sich mein PC quergestellt.

    RECT position;
    LRESULT ergebnis;
    
    ergebnis = SendMessage(child, LVM_GETITEMCOUNT, 0, 0);
    printf("%i ", (int)ergebnis);
    
    position.left = position.top = position.right = position.bottom = LVIR_ICON;
    ergebnis = SendMessage(child, LVM_GETITEMRECT, 1, (LPARAM)&position);
    printf("%i - %lu %lu %lu %lu\n", (int)ergebnis, position.left, position.right, position.top, position.bottom);
    
    // Ausgabe: 1 1 - 1 1 1 1, also 1 Element vorhanden, erfolgreiches Senden, aber keine Koords...
    

    Spy++ hat beide Nachrichten korrekt angezeigt und in der letzten Antwort stehen auch die korrekten Koords (0 24 1260 44) des ersten Eintrages der ListView drin, nur in meinem Programm kann ich einfach nicht drauf zugreifen... Habe keinen Schimmer, woran das liegt... Wahrscheinlich funktioniert deswegen der einfache Weg aus Post 1 auch nicht.

    Falls es noch ein paar Hinweise/Anregungen gibt, immer her damit. Ansonsten danke fürs lesen ^^
    Gruß vom Waschbärn



  • Ähm, dir ist klar, dass das nicht dein Prozess ist? Du wirst dir wohl Speicher im fremden Prozess reservieren müssen und mit Read- und WriteProcessMemory arbeiten müssen: http://michael-puff.de/Programmierung/Artikel/AccessComCtrl32.shtml



  • Hi Luckie,

    danke für den Tipp!!! Es fiel mir schwer, deinen Link nach C zu übersetzen, doch mit den Stichworten von dir habe ich eine gute Seite gefunden. Ich habe etwas gebraucht, bis ich den Code verstanden habe, doch nun ist es mir endlich gelungen, den Text eines Items aus der ListView auszulesen (die Koords kommen auch bald) 🙂

    Hier die Anleitung: http://www.codeproject.com/Articles/5570/Stealing-Program-s-Memory

    Vielen Dank für die Hilfe,
    Gruß, Waschbär


Anmelden zum Antworten