TEdit einer fremden Anwendung ansprechen



  • Hallo, und zwar schreibe ich momentan ein Programm, was ich ausführen möchte, nachdem ich ein anderes gestartet habe.

    Aufgabe des Programms soll es sein bestimmten Text in das richtige Edit zu schreiben.

    Es sind 4 derartige Editfenster. Mein Problem besteht nun darin, diese jeweils zu identifizieren, damit in die richtigen Felder geschrieben wird.



  • Hat keiner eine Idee?

    Mein Gedanke wäre über die Namen der Editfelder. Nur hab ich keine Ahnung wie ich an diese heran komme.

    Ich würde nach soetwas nicht fragen, wenn die Reihenfolge in der mein Programm die Handle der Editfelder aufnimmt nicht immer unterschiedlich wäre.
    Genau darum muss ich eben irgendwie jedem Editfeld irgendwas entnehmen was dieses eindeutig identifiziert.



  • Position?



  • Wäre eine möglichkeit. Nur mag ich mich mit dieser nicht anfreunden wollen.



  • Normalerweise sollten die Editfenster eine eindeutige ID haben.



  • Ich hab es jetzt irgendwie hinbekommen, dass der Text immer in das richtige Edit geht.

    Bleibt mir noch ein Problem. - Ist es möglich per SendMessage() in ein ListView einer fremden Anwendung zu schreiben? Wenn ja, wie müsste der SendMessage() in etwa aussehen, wenn ich da eine Zeichenkette reinschreiben möchte.



  • Hi inflames

    Du willst ein neues Item in deine Listview stöpseln, richtig?!

    Wenn ja, dann schau dir mal folgenden Link an:
    http://msdn.microsoft.com/en-us/library/bb761107(VS.85).aspx

    Die restflichen Messages für Listviews bekommst du hier:
    http://msdn.microsoft.com/en-us/library/cc656508(VS.85).aspx

    Hoffe es hat dir geholfen...:)

    Gruß
    DaMapfi



  • Muss ich dazu irgendetwas linken?
    Visual Studio 2003 sagt mir bei LVM_INSERTITEM und LV_ITEM, dass diese Bezeichner nicht deklariert wären.

    // Ok hatte vergessen den Header mit include zu laden.

    //
    Erstmal mein Code:

    LV_ITEM item;
    item.iItem = 0;
    item.pszText = (LPSTR)line.c_str();
    SendMessage(list, LVM_INSERTITEM, NULL, (LPARAM)item);
    

    Ich erhalte hier den Fehler:

    c:\patrick\perry\EnterpriseDynamicsLicense\EnterpriseDynamicsLicense.cpp(112): error C2440: 'Typumwandlung': 'LVITEMA' kann nicht in 'LPARAM' konvertiert werden
    

    Setze ich wie im MSDN vor das Item ein (LPLVITEM) erhalte ich den Fehler, dass LVITEMA nicht nach LPLVITEMA konvertiert werden kann.
    Hoffe hier hat noch jemand rat für mich.



  • Ich weiss ja nicht ob das einfügen eines Items in einen fremden Listview so einfach möglich ist, aber Probleme könnte es geben wenn:
    - die Listviewitems pszText = LPSTR_TEXTCALLBACK haben
    - im Eventhandler auf NM_CUSTOMDRAW abgefragt wird
    - der Listview Ownerdraw ist



  • inflames2k schrieb:

    Ich erhalte hier den Fehler:

    c:\patrick\perry\EnterpriseDynamicsLicense\EnterpriseDynamicsLicense.cpp(112): error C2440: 'Typumwandlung': 'LVITEMA' kann nicht in 'LPARAM' konvertiert werden
    

    mach mal so

    SendMessage(list, LVM_INSERTITEM, NULL, (LPARAM)&item)
    

    und mach ein

    memset(&item, 0, sizeof(item));
    

    davor, um sicher zu gehn, daß kein Mist in der Struktur steht



  • Danke, darauf war ich auch gerade gekommen.

    Ein Problem hab ich nun noch. Das Item wird hinzugefügt, allerdings nicht der Text, der eingefügt werden soll.



  • guggstdu schrieb:

    Ich weiss ja nicht ob das einfügen eines Items in einen fremden Listview so einfach möglich ist, aber Probleme könnte es geben wenn:
    - die Listviewitems pszText = LPSTR_TEXTCALLBACK haben
    - im Eventhandler auf NM_CUSTOMDRAW abgefragt wird
    - der Listview Ownerdraw ist

    Da ich die Antwort jetzt erst sehe, dass Item erstellen macht das Programm. Es fügt nur leider keinen Text hinzu, sondern nur dieses Item.

    Nur wie löse ich das Problem, dass der Text auch gesetzt wird?

    Mein aktueller Code ist:

    LVITEM item;	
    memset(&item, 0, sizeof(LVITEM));
    item.mask = LVIF_TEXT;
    // Falls ich ein Verständniss Problem habe, nachfolgend ist doch der Text der eingefügt wird richtig?
    item.pszText = (LPSTR)line.c_str();					
    
    ListView_InsertItem(list, (LPARAM)&item);
    


  • item.pszText = (LPSTR)"einfach mal einen Teststring einfügen";
    

    nur um mal zu sehen, daß auch wirklich Text übergeben wird.

    Aber wie bereits erwähnt, bei ownerdraw oder customdraw kann es egal sein mit welchem Text das item erzeugt wurde, weil möglicherweise der Text erst in der entsprechenden Routine festgelegt wird.

    Mein Ratschlag ist: programmiere auf die Schnelle eine eigene kleine Anwendung mit Listview, da weisst du ja genau wie die aufgebaut ist und teste da erstmal, dannach nehme dir die fremde Anwendung vor.



  • Wenn man nicht wirklich weiß, was in der anderen Anwendung so alles abläuft, dann sollte man von diesen Aktionen die Finger lassen!

    Läuft die Listenansicht z.B. im OwnerData-Modus, dann kann ein neuer unerwarteter Eintrag das Programm schnell zum Absturz bringen. Wenn hier alle Einträge in einem Array gehalten werden und nicht vor jedem Zugriff auf Array-Grenzen getestet wird, dann wird schnell mal danebengegriffen. Am Ende ärgert sich dann der Programmierer immer mit Problemen herum, für die er keine Erklärung findet. Nicht zu vergessen die Anwender, die sich über ein fehlerhaftes Programm beschweren.


  • Mod

    Mann kann ListView_InsertItem auf ein List-Control in einer anderen Anwendung nicht ausführen, denn der Zeiger auf das LV_ITEMist in dem anderen Prozessraum ungültig!



  • Ok dann mach ich das ganze doch über den 2. Weg.
    Gibt ja noch den Extradialog über den eingefügt wird. Dachte nur dass man evtl. direkt ins ListView eintragen kann.


Anmelden zum Antworten