System - Text an fremde Fenster senden



  • ich habe letztens eine funktion gesucht um einen string an ein anderes programm zu senden ... z.b. für die ms-dos eingabeaufforderung! oder andere programme!
    da ich leider keien funktion gefunden habe habe ich mal eine geschrieben .. und da es sehr viel arbeit war die ganzen tastaturcodes rauszusuchen wollte ich anderen diese arbeit erspaaren

    einfach die kunktion aufrufen und namen des fensters und den text übergeben ...

    TextSend("Unbenannt - Editor","Dies ist ein test!!\n");
    
    void __fastcall TForm1::TextSend(AnsiString fenster,AnsiString Text)
    {
      int x;
      int key=' ',gross,altgr;
      HWND window=FindWindow(0,fenster.c_str());
      SetForegroundWindow(window);
      for(x=0;x<strlen(Text.c_str());x++)
      {
        switch(Text.c_str()[x])
        {
          case'0':{key='0';gross=0;altgr=0;break;}
          case'1':{key='1';gross=0;altgr=0;break;}
          case'2':{key='2';gross=0;altgr=0;break;}
          case'3':{key='3';gross=0;altgr=0;break;}
          case'4':{key='4';gross=0;altgr=0;break;}
          case'5':{key='5';gross=0;altgr=0;break;}
          case'6':{key='6';gross=0;altgr=0;break;}
          case'7':{key='7';gross=0;altgr=0;break;}
          case'8':{key='8';gross=0;altgr=0;break;}
          case'9':{key='9';gross=0;altgr=0;break;}
    
          case'a':{key='A';gross=0;altgr=0;break;}
          case'b':{key='B';gross=0;altgr=0;break;}
          case'c':{key='C';gross=0;altgr=0;break;}
          case'd':{key='D';gross=0;altgr=0;break;}
          case'e':{key='E';gross=0;altgr=0;break;}
          case'f':{key='F';gross=0;altgr=0;break;}
          case'g':{key='G';gross=0;altgr=0;break;}
          case'h':{key='H';gross=0;altgr=0;break;}
          case'i':{key='I';gross=0;altgr=0;break;}
          case'j':{key='J';gross=0;altgr=0;break;}
          case'k':{key='K';gross=0;altgr=0;break;}
          case'l':{key='L';gross=0;altgr=0;break;}
          case'm':{key='M';gross=0;altgr=0;break;}
          case'n':{key='N';gross=0;altgr=0;break;}
          case'o':{key='O';gross=0;altgr=0;break;}
          case'p':{key='P';gross=0;altgr=0;break;}
          case'q':{key='Q';gross=0;altgr=0;break;}
          case'r':{key='R';gross=0;altgr=0;break;}
          case's':{key='S';gross=0;altgr=0;break;}
          case't':{key='T';gross=0;altgr=0;break;}
          case'u':{key='U';gross=0;altgr=0;break;}
          case'v':{key='V';gross=0;altgr=0;break;}
          case'w':{key='W';gross=0;altgr=0;break;}
          case'x':{key='X';gross=0;altgr=0;break;}
          case'y':{key='Y';gross=0;altgr=0;break;}
          case'z':{key='Z';gross=0;altgr=0;break;}
          case'ß':{key=219;gross=0;altgr=0;break;}
          case'ä':{key=222;gross=0;altgr=0;break;}
          case'ü':{key=186;gross=0;altgr=0;break;}
          case'ö':{key=192;gross=0;altgr=0;break;}
    
          case'A':{key='A';gross=1;altgr=0;break;}
          case'B':{key='B';gross=1;altgr=0;break;}
          case'C':{key='C';gross=1;altgr=0;break;}
          case'D':{key='D';gross=1;altgr=0;break;}
          case'E':{key='E';gross=1;altgr=0;break;}
          case'F':{key='F';gross=1;altgr=0;break;}
          case'G':{key='G';gross=1;altgr=0;break;}
          case'H':{key='H';gross=1;altgr=0;break;}
          case'I':{key='I';gross=1;altgr=0;break;}
          case'J':{key='J';gross=1;altgr=0;break;}
          case'K':{key='K';gross=1;altgr=0;break;}
          case'L':{key='L';gross=1;altgr=0;break;}
          case'M':{key='M';gross=1;altgr=0;break;}
          case'N':{key='N';gross=1;altgr=0;break;}
          case'O':{key='O';gross=1;altgr=0;break;}
          case'P':{key='P';gross=1;altgr=0;break;}
          case'Q':{key='Q';gross=1;altgr=0;break;}
          case'R':{key='R';gross=1;altgr=0;break;}
          case'S':{key='S';gross=1;altgr=0;break;}
          case'T':{key='T';gross=1;altgr=0;break;}
          case'U':{key='U';gross=1;altgr=0;break;}
          case'V':{key='V';gross=1;altgr=0;break;}
          case'W':{key='W';gross=1;altgr=0;break;}
          case'X':{key='X';gross=1;altgr=0;break;}
          case'Y':{key='Y';gross=1;altgr=0;break;}
          case'Z':{key='Z';gross=1;altgr=0;break;}
          case'?':{key=219;gross=1;altgr=0;break;}
          case'Ä':{key=222;gross=1;altgr=0;break;}
          case'Ü':{key=186;gross=1;altgr=0;break;}
          case'Ö':{key=192;gross=1;altgr=0;break;}
          case'µ':{key='M';gross=0;altgr=1;break;}
    
          case'=':{key='0';gross=1;altgr=0;break;}
          case'!':{key='1';gross=1;altgr=0;break;}
          case'"':{key='2';gross=1;altgr=0;break;}
          case'§':{key='3';gross=1;altgr=0;break;}
          case'$':{key='4';gross=1;altgr=0;break;}
          case'%':{key='5';gross=1;altgr=0;break;}
          case'&':{key='6';gross=1;altgr=0;break;}
          case'/':{key='7';gross=1;altgr=0;break;}
          case'(':{key='8';gross=1;altgr=0;break;}
          case')':{key='9';gross=1;altgr=0;break;}
    
          case'+':{key=187;gross=0;altgr=0;break;}
          case'-':{key=189;gross=0;altgr=0;break;}
          case'.':{key=190;gross=0;altgr=0;break;}
          case',':{key=188;gross=0;altgr=0;break;}
          case'#':{key=191;gross=0;altgr=0;break;}
    
          case'*':{key=187;gross=1;altgr=0;break;}
          case'_':{key=189;gross=1;altgr=0;break;}
          case':':{key=190;gross=1;altgr=0;break;}
          case';':{key=188;gross=1;altgr=0;break;}
          case'\'':{key=191;gross=1;altgr=0;break;}
          case'´':{key=221;gross=1;altgr=0;break;}
          case'~':{key=191;gross=1;altgr=1;break;}
    
          case'}':{key='0';gross=0;altgr=1;break;}
          case'²':{key='2';gross=0;altgr=1;break;}
          case'³':{key='3';gross=0;altgr=1;break;}
          case'{':{key='7';gross=0;altgr=1;break;}
          case'[':{key='8';gross=0;altgr=1;break;}
          case']':{key='9';gross=0;altgr=1;break;}
          case'\\':{key=219;gross=0;altgr=1;break;}
          case' ':{key=' ';gross=0;altgr=0;break;}
    
          case'^':{key=220;gross=0;altgr=0;break;}
          case'°':{key=220;gross=1;altgr=0;break;}
          case'<':{key=226;gross=0;altgr=0;break;}
          case'>':{key=226;gross=1;altgr=0;break;}
          case'|':{key=226;gross=0;altgr=1;break;}
          case'\n':{key=VK_RETURN;gross=0;altgr=0;break;}
        }
    
        if(altgr==1)keybd_event(VK_RMENU, 0, 0, NULL);
        if(gross==1)keybd_event(VK_SHIFT, 0, 0, NULL);
        keybd_event(key, 0, 0, NULL);
        keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
        if(gross==1)keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
        if(altgr==1)keybd_event(VK_RMENU, 0, KEYEVENTF_KEYUP, 0);
      }
       if(0==strlen(Text.c_str()))
       {
         keybd_event(' ', 0, 0, NULL);
         keybd_event(' ', 0, KEYEVENTF_KEYUP, 0);
       }
    }
    

    Edit:
    Bitte die Code-Tags benutzen. Danke!



  • void TextSend(AnsiString wintext, AnsiString text)
    {
      HWND hwndPrev  = GetForegroundWindow();
      HWND hwnd      = FindWindow(0, wintext.c_str());
      SetForegroundWindow(hwnd);
    
      DWORD idAttach   = GetCurrentThreadId();
      DWORD idAttachTo = GetWindowThreadProcessId(hwnd, NULL);
      if( AttachThreadInput(idAttach, idAttachTo, TRUE) == FALSE )
         ShowMessage("ERROR: AttachThreadInput\(\)");
    
      HWND hwndFocus = GetFocus();
      if(hwndFocus != FALSE)
         SendMessage(hwndFocus, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)text.c_str());
    
      if( AttachThreadInput(idAttach, idAttachTo, FALSE) == FALSE )
         ShowMessage("ERROR: AttachThreadInput\(\)");
    
      SetForegroundWindow(hwndPrev);
    }
    


  • Nicht Text neu setzen, sondern Text anhängen (wie im allerersten Posting):

    void TextSend(AnsiString wintext, AnsiString text)
    {
      HWND  hwndPrev   = GetForegroundWindow();
      HWND  hwnd       = FindWindow(0, wintext.c_str());
      DWORD idAttach   = GetCurrentThreadId();
      DWORD idAttachTo = GetWindowThreadProcessId(hwnd, NULL);
    
      SetForegroundWindow(hwnd);
    
      if( AttachThreadInput(idAttach, idAttachTo, TRUE) == FALSE )
         ShowMessage("ERROR: AttachThreadInput\(\)");
    
      HWND hwndFocus = GetFocus();
    
      if(hwndFocus)
      {
         int length = (int)SendMessage(hwndFocus, WM_GETTEXTLENGTH, 0, 0);
         length++;
         char* prevText = new char[length + text.Length()];
         SendMessage(hwndFocus, WM_GETTEXT, (WPARAM)(length), (LPARAM)prevText);
         strcat(prevText, text.c_str());
         if( SendMessage(hwndFocus, WM_SETTEXT, 0, (LPARAM)prevText) == FALSE )
            ShowMessage("ERROR: WM_SETTEXT");
         delete[] prevText;
      }
    
      if( AttachThreadInput(idAttach, idAttachTo, FALSE) == FALSE )
         ShowMessage("ERROR: AttachThreadInput\(\)");
    
      SetForegroundWindow(hwndPrev);
    }
    

    [ Dieser Beitrag wurde am 05.09.2002 um 21:07 Uhr von WebFritzi editiert. ]



  • WebFritzi:
    Funktionieren deine Methoden auch mit Konsolen-Fenstern (hab grad keinen Windows-BCB zur Hand)? Mit WM_SETTEXT wohl eher nicht, oder?

    Und ja, auch dieser Thread kommt nach einer kurzen Reifezeit in die FAQ. 😉



  • Oder mit Hilfe des Clipboards:

    void SendText(AnsiString wintext, AnsiString text)
    {
       HWND hwndPrev = GetForegroundWindow();
       HWND hwnd     = FindWindow(0, wintext.c_str());
       Clipboard()->AsText = text;
       SetForegroundWindow(hwnd);
       keybd_event(VK_SHIFT, 0, 0, 0);
       keybd_event(VK_INSERT, 0, 0, 0);
       keybd_event(VK_INSERT, 0, KEYEVENTF_KEYUP, 0);
       keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
       SetForegroundWindow(hwndPrev);
    }
    

    Finde ich bisher am besten. 😉



  • Musst du nur noch den alten Clipboard-Inhalt zwischenspeichern, sofern vorhanden. Ich würde es ganz schön zum Kotzen finden, wenn mir ein Programm den ungefragt überschreibt.



  • Zur Eingabeaufforderung: Hab jetzt alle 4 Funktionen getestet. Keine von allen funzt da.

    Zum Clipboard: Im Allgemeinen hast du recht. Aber ich denke da gerade an ein Proggi, das ich mal geschrieben hatte. Das war eine virtuelle deutsche Tastatur, bestehend aus Buttons und einem Edit-Feld. Wird ein Button gedrückt, dann erscheint die entsprechende Operation im Edit-Feld. Mit diesen Methoden hier kann ich jetzt auf das Edit-Feld verzichten. Ein Dankeschön an dieser Stelle an Hellmaster, der mich auf diesen Gedanken gebracht hat. Nunja, es müssten also andauernd Buchstaben/Zeichen an das Eingabefenster geschickt werden. Schwierig ist das mit Formularen im IE (so wie das, in das ich gerade schreibe). Das sind nämlich keine Fenster. Man muss also Hellmasters oder meine Clipboard-Funktion benutzen. Da ich Hellmasters nicht so ganz traue (er verzeihe es mir 😉 ), würde ich meine nehmen. Und da wäre es doch ziemlich blöde, immer wieder den alten Clipboard-Inhalt nach dem Senden eines Buchstabens in das Clipboard einzufügen. In diesem Falle sollte man den User vielleicht benachrichtigen, dass jegliche Clipboard-Daten verloren gehen.



  • es sei dir verziehen das du meiner funktion nicht traust ...
    ich abe sie aber getestet .. sie funktioniert einewandfrei ...
    ich habe ein programm zum archivieren von cd´s geschrieben .. und da ich für meien filme covers drucken wollte habe ich mit dieser funktion die daten an den Nero Covereditor gesendet .... ich habe es mit 400 filmen getestet ... ohne einen einzigen fehler .... das programm ist mit der TAB taste von feld zu feld gesprungen und hat die felder mit meiner funktion ausgefüllt ... alles ohne probleme oder fehler.... also 400 fach getestet!!!
    mfg
    Hellmaster1024



  • OK, ich glaub dir. 🙂



  • Ja und wie kann ich nun Zeichen an die MS-DOS-Eingabeaufforderung senden?



  • Bastel dir doch selber was, du Superformel. 😉



  • Wenn ich mich mal hier hinhängen darf 😉
    Ich wollte mich der Frage anschlissen, wie ich nun Texte an eine DOS-Eingabeaufforderung senden kann ?

    Gruß Hansss



  • Hellmaster1024 schrieb:

    einfach die funktion aufrufen und namen des fensters und den text übergeben ...

    Also ungefähr so:

    TextSend("c:\\windows\\system32\\cmd.exe","dir\n");
    


  • Danke fubar, aber er sendet nichts an die konsole bei folgendem Quellcode:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void TForm1::TextSend(AnsiString wintext, AnsiString text)
    {
      HWND hwndPrev  = GetForegroundWindow();
      HWND hwnd      = FindWindow(0, wintext.c_str());
      SetForegroundWindow(hwnd);
    
      DWORD idAttach   = GetCurrentThreadId();
      DWORD idAttachTo = GetWindowThreadProcessId(hwnd, NULL);
      if( AttachThreadInput(idAttach, idAttachTo, TRUE) == FALSE )
         ShowMessage("ERROR: AttachThreadInput\(\)");
    
      HWND hwndFocus = GetFocus();
      if(hwndFocus != FALSE)
         SendMessage(hwndFocus, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)text.c_str());
    
      if( AttachThreadInput(idAttach, idAttachTo, FALSE) == FALSE )
         ShowMessage("ERROR: AttachThreadInput\(\)");
    
      SetForegroundWindow(hwndPrev);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     TextSend("C:\\WINDOWS\\System32\\cmd.exe", "dir\n");
    }
    //---------------------------------------------------------------------------
    

    Danke und Gruß Hansss



  • Ich habe auch nur Hellmasters Funktion getestet und damit funktionierte das einwandfrei...



  • Ja, danke funktioniert mit Hellmasters Funktion, thx



  • Leider fontioniert das bei mir nicht, da

    __fastcall TForm1::TextSend(AnsiString fenster,AnsiString Text)
    

    kein Member von TForm1 ist. Ich bin noch Newbie ;).



  • Dann informiere dich am besten mal darüber wie man Klassenmethoden deklariert...

    -junix



  • Tip: schau mal nach, wo/wie die vom BCB automatisch erstellten TForm1::XYZ-Funktionen deklariert sind.


Anmelden zum Antworten