Mit WM_SETTEXT Text in fremdes Programm schreiben ?



  • Hi,

    also ich habe das Programm Chat32, welchem ich über mein
    Programm gerne Text übersenden möchte. Der Text soll dort
    im Texteingabefeld erscheinen (ist das einzige Feld wo
    man was reinschreiben kann in Chat32).

    Mit
    CWnd* hwndWinamp=FindWindow("Chat32",NULL);

    finde ich das Programm dem ich Text übergeben will.
    OK, klappt auch.

    Nur wie sende ich jetzt dort z.B. den Text "Hallo Welt" rein
    (soll beim anklicken eines Buttons bei mir im Prog passieren) ?
    Wenn das Senden klappt, wie löse ich dann das Ereignis "Return"
    in Chat32 noch zusätzlich aus (muss ich dann nen Code für "return" senden)?

    SendMessage / WM_SETTEXT, wird das hierzu verwendet ? Tut mir leid, kenne mich
    noch nicht so richtig damit aus 😞

    Hoffe ihr versteht was ich meine.



  • Hi!
    Den text kannst du direkt setzen. Z.b. hier beim WIndows rechner

    CWnd* pWnd = FindWindow(NULL,"Rechner");
    if(pWnd) {
       HWND hWnd;
       pWnd->GetDlgItem(0x193, &hWnd);
       ASSERT(IsWindow(hWnd));
       CWnd* pCtrl = (CWnd*)CWnd::FromHandle(hWnd);
       ((CStatic*)pCtrl)->SetWindowText("8+5");
    }
    

    Beim Button würde ich einfach in Spy++ genauer nachschaun und dann die Nacricht WM_COMMAND mit entsprechenden Paramater mit SendMessage ans Fenster schicken.

    mfg



  • Hallo mike84,

    danke für die Info. Werde es wenn ich wieder an meinem PC
    bin gleich ausprobieren !



  • Hier wolt schon mal eine ein RETURN an ein anderes Programm senden.
    Schaus dir an, vielleicht hilft´s.

    http://www.c-plusplus.net/forum/viewtopic.php?t=47409

    MFG, Sigi



  • Du brauchst das Handle des Editfeldes, nicht des Fensters!



  • Hi!
    Sende einfach ein WM_KEYDOWN ans Edit...

    mfg
    PS: Sigi, kommst du aus "der Steiermark"? 😃



  • Hi!
    Sende einfach ein WM_KEYDOWN ans Edit...

    mfg
    PS: Sigi, kommst du aus "der Steiermark"? 😃



  • @mike84
    Wie kommst auf des? 😮
    STIMMT! 🤡



  • BigSigi schrieb:

    @mike84
    Wie kommst auf des? 😮
    STIMMT! 🤡

    Naja - haste selber in dein Profil eingetragen! 🙄



  • @Nemesyzz
    Hatte ich ganz vergessen! 😃
    Hab ich nicht immer drinnen stehen gehabt, deshalb.
    MFG, Sigi

    PS: Weiß nicht warum die Frage überhaupt kam 🙄



  • BigSigi schrieb:

    PS: Weiß nicht warum die Frage überhaupt kam 🙄

    Wal i a a Steirer bin 😃 Wollte nur wissen, ob du die österreichische Steiremark meinst 😃



  • Ich stehe gerade vor dem gleichen bzw. ähnlichen Problem.

    Ich habe einen Editor, der einen Text bekommt. Dieser soll dann gleich weiter an Word, Editor oder WordPad geleitet werden.

    Ziel ist es, daß mein Editor nachher versteckt läuft und der Text an die Cursorposition des aktiven Fensters geschrieben wird.

    Mein erster Ansatz war nun am Ende den Text direkt in das Edit-Feld des Notepads zu posten, was auch gelang. Jedoch gelang mir das mit Word bzw dem WordPad nicht, da ich kein Handle auf die entsprechenden Edit-Felder bekam.

    WM_KEYDOWN sollte ich ja auch direkt an ein Fenster senden können, oder?
    Leider klappte das bei mir nicht oder ich habe noch nen Haken drin.

    Hier mal ein kleines Codebeispiel:

    CString strText = "Hallo Welt";
    HWND hWnd = ::FindWindow((LPCTSTR)"Notepad", NULL);
    for( int i=0; i < strText.GetLength(); i++ )
    {
    	WPARAM wParam = (WPARAM)strText.GetAt(i);
    	::SendMessage(hWnd, WM_KEYDOWN,wParam,(LPARAM)0);
    }
    


  • Hi!
    Probier mal

    CWnd* pWnd = FindWindow(NULL,"Dokument - WordPad");
    if(pWnd) {
       HWND hWnd;
       pWnd->GetDlgItem(0xE900, &hWnd);
       ASSERT(IsWindow(hWnd));
       CWnd* pCtrl = (CWnd*)CWnd::FromHandle(hWnd);
       ((CRichEditCtrl*)pCtrl)->ReplaceSel("Hallo WorPad");
    }
    

    mfg



  • mike84 schrieb:

    Hi!
    Probier mal

    CWnd* pWnd = FindWindow(NULL,"Dokument - WordPad");
    if(pWnd) {
       HWND hWnd;
       pWnd->GetDlgItem(0xE900, &hWnd);
       ASSERT(IsWindow(hWnd));
       CWnd* pCtrl = (CWnd*)CWnd::FromHandle(hWnd);
       ((CRichEditCtrl*)pCtrl)->ReplaceSel("Hallo WorPad");
    }
    

    mfg

    werde ich morgen mal machen.

    wie kommste an die id von dem edit feld? ich sehe da nicht sonderlich viel mit spy++

    So habe mir das nochmal in meinem Quellcode angeguckt. Auf die 0xE900 kam ich auch, aber ich griff halt mit:

    ((CRichEditCtrl*)pCtrl->Paste();
    

    darauf zu und das wollte er nicht.

    Aber sollte ich das nicht auch schaffen wenn ich nen KeyDown an das Zielfenster/ aktive Fenster schicke? Dragon Naturally Speaking macht es ja auch zum Beispiel in egal welcher Applikation.



  • Hi!
    Also bei mir geht das Paste auch. Du darfst nur nicht direkt auf Edit ähnliche Klassen zugreifen. Bei einem Button würde ein Findwindow mit direktem CButton Pointer genügen.

    mfg



  • Komisch bei Paste ging es nicht bei mir. Der Code war der gleiche. Ich habe halt nur Paste() mit ReplaceSel() ersetzt und dann ging es. Die Lösung wurde ja schon weiter oben beschrieben.

    Nur frage ich mich jetzt wie ich es generell in das aktive Fenster pasten kann 😕

    Ich kann mir ja schlecht zur Laufzeit die Steuerelement-ID herausziehen.

    Hast Du dazu vielleicht noch eine Idee?



  • Hi!
    Ähmm ist nur so ne Frage, aber war was im Arbeitsspeicher drinnen? 😃
    Wenn ja, könnte es sein, dass M$ bei einer neuen WordPad Verion die ID geändert hat. Was sagt dein Spy++?

    mfg



  • Ich kopierte gerade frisch den Text in die Zwischenablage und das WortPad lief die ganze Zeit durch.

    Mit dem ReplaceSel() funktioniert es ja gut.

    Prima wäre es jetzt noch sowas für jede beliebige Anwendung hinzukriegen. Aber mit dem Lösungsweg wird es ja nicht klappen. Ich bin ja immer auf das Spy++ angewiesen.



  • Hi!
    Naja. Du könntest ja EnumWindows nutzen oder http://www.codeproject.com/dialog/windowfinder.asp nutzen
    Das mit dem Paste versteh ich nicht. Geht bei mir einwandfrei. Welches Win / VC hast du?

    mfg



  • Danke das werde ich mir nochmal angucken.

    Ich habe Windows2000 und Visual Studio 6.0


Anmelden zum Antworten