Eine Zeile in einer fremden ListView anklicken



  • Hallo,

    ich hoffe ich bin hier richtig, ich programmiere grade eine DLL mit C über die Win32 API und habe ein Problem... Ich möchte ineinem fremden Programm eine Zeile in einer Tabelle (ListView) anklicken, damit sie selektiert ist. Nun arbeitet mein Code schon richtig, die Zeile wird selektiert, jedoch passiert nicht das gleiche, wie als wenn ich einen klick auf diese Zeile mache. (Dann verändert sich noch was anderes in dem Programm). Ich kann das simulieren, in dem ich Shift+Links-Klick drücke. Dann wird die Zeile auch selektiert, aber ansionsten nichts gemacht... hier mal mein Code

    lvi.state=LVIS_SELECTED;
        lvi.stateMask=LVIS_SELECTED;
        WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
        SendMessage(listview, LVM_SETITEMSTATE , (WPARAM)i, (LPARAM)_lvi);
    

    Durch den Code wird die Zeile " i " markiert. Aber ich möchte, dass darauf quasi ein Mausklick gemacht wird, ansonsten passiert in dem anderen Programm nichts ... hat jemand einen Tipp ?

    Dankesehr


  • Mod

    Dann wird das Programm eben auf den Maus-Event reagieren und keinen Handler haben für das Ändern der Selektion.

    Maus-Events kann man nur korrekt mit SendInput simulieren.



  • hmm ok
    dann versuche ich es vielleicht anders.
    Ich hab mal die Messages des Listviews dieses anderen Programmes beobachtet, während ein anders Programm (das macht es richtig) die Zeilen markiert. Das Listview bekommt immer die "LVM_SETSELECTIONMARK" message mit Indizes hintendran. Ich markiere immoment die zeilen ja mit LVM_SETITEMSTATE.
    Aber wenn ich LVM_SETSELECTIONMARK mit SendMessage an das Listview schicke, kann ich die DLL nicht mehr complilieren... er sagt unbekannter Bezeichner, in der MSDN seh ich aber nicht was ich dazu noch einbinden muss ?!

    Edit: ich kann das Makro: ListView_SetSelectionMark() auch nicht benutzen. "undefined reference to `_ListView_SetSelectionMark'"... ich hab aber den korrekten HEader eingebunden ! #include <commctrl.h>

    versteh ich nicht ...

    wie dem auch sei, ich hab das gefühl mein Ansatz mit dem SETITEMSTATE ist schon richtig. Es werden ja die gewünschten Zeilen markiert. Jedoch bleiben auch die vorher markierten weiter markiert, das ist weil man in dieser blöden Tabelle mehrfachauswahl machen kann. es soll aber, wenn eine neue markiert wird, die alte nicht mehr markiert werden ...


  • Mod

    Das ist eine Nachricht und keine Benachrichtigung! Das nützt Dir aber gar nichts...



  • ja gut aber es muss eine Möglichkeit geben, wie es ohne mouseevent funktioniert. Da bei sendinput ja das Fenster offen und sichtbar sein muss...

    Ein anderes Programm macht ja das was ich auch umsetzen mag und da geht es.
    Ich denke es hat was damit zu tun, dass wirklich nur eine zeile selektiert wird. Bei meiner jetzigen Methode bleiben vorherhige Zeilen weiter markiert, so als ob ich mit STRG dazuselektieren würde. Ich müsste wohl zuerst alles andere Deselektieren..



  • ok ich hab es hinbekommen, ich hatte den richtigen riecher 🙂
    Ich hab einfach die Zeile (nach dem ich sie selektiert habe) nochmal deselektiert mit

    SendMessage(listview, LVM_SETITEMSTATE , (WPARAM)-1, (LPARAM)_lvi);
    

    Jetzt funktioniert es wie ich es wollte... !!


Anmelden zum Antworten