Text von fremden Programmen auslesen/senden



  • Über FindWindowEx kannst du dir theoretisch für jedes beliebige Fenster das Handle besorgen (indem du es mehrmals hintereinander aufrufst)

    Mit Enum(Child)Windows wird eine von dir angegebene Callback-Funktion für jedes (Child-)Fenster aufgerufen, dort kannst du dann machen, was du eben machen willst 😉



  • Vielen Danke schon mal

    Ich habe gerade ein wenig im Forum herum gesucht noch.
    Dabei ist mir folgende Idee gekommen. In einem ICQ Fenster ist die Klasse wo Text Ein und Ausgegeben wird "RichEdit20A". Es gibt doch auch die Möglichkeit die Handles über die Klassen dann zu bekommen. Wie würde das dann in c++ Code aussehen? Das Handle für das Fenster jeweils habe ich.
    Wäre super nett 👍



  • Schau dir doch bitte mal die Parameter von FindWindowEx an - btw: deine "Objekte" sind auch nichts anderes als Fenster 😉



  • Ich glaub ich tu mich wirklich etwas schwer damit 🤡

    HWND hwnd = FindWindow(0, ICQFensterNm[0].c_str());
      SetForegroundWindow(hwnd);
    
      HWND richedit = FindWindowEx(hwnd,NULL,"RichEdit20A",NULL);
      EnableWindow(richedit,FALSE);
    

    Wieso klappt das mit dem Handle nicht?
    Also das Richedit würd nicht ausgeblendet (was bei anderen objekten sonst funktioniert.
    @flenders: kannst du mir vielleicht ein Codebsp. geben. Sonst werd ich daran noch verrückt 😃



  • Könnte es sein, dass das RichEdit20A-Control gar kein direktes Child des Hauptfensters ist?!
    Die genaue Verschachtelung kannst du am besten mit Spy++ bzw. WinSpector ermitteln 🙂



  • Also das habe ich natürlich schon gemacht.
    Spuckt folgendes aus:

    Properties for window 0x005B0862 
    Item Value 
    Class Name RichEdit20A  
    Text  
    Rectangle 447, 539, 914, 647  
    Size 467, 108  
    Client Rectangle 0, 0, 461, 102  
    Client Size 461, 102  
    Styles WS_CHILD
    WS_VISIBLE
    WS_BORDER
    WS_TABSTOP
    0x00004420  
    
    StylesEx WS_EX_CLIENTEDGE
    WS_EX_LEFT
    WS_EX_LTRREADING
    WS_EX_RIGHTSCROLLBAR  
    
    ID 101  
    
    Properties OleDropTargetInterface 0x00199B18 (1678104)
    OleDropTargetMarshalHwnd 0x00010250 (66128)  
    
    Class specific none  
    
    Owner EXE C:\Programme\ICQ\Icq.exe
    

    Wenn ich es mit der ID 101 bzw. 0x65 versuche über GetDlgItem klappt es auch nicht so wirklich 😞

    Aktueller Quelltext der mit dem ICQ RichEdit20A nicht funktioniert, aber zB. mit dem Notepad (über GetDlgItem)

    HWND hwndPrev = GetForegroundWindow();
      HWND hwnd = FindWindow(0, ICQFensterNm[0].c_str());
      SetForegroundWindow(hwnd);
    
      //HWND richedit = FindWindowEx(hwnd,NULL,"RichEdit20A",NULL);
      //EnableWindow(richedit,FALSE);
      HWND richedit = GetDlgItem(hwnd, 0xF);
      SendMessage(richedit,EM_SETSEL,0,-1); //start selecting
      SendMessage(richedit,WM_COPY,0,0);
      SendMessage(richedit,EM_SETSEL,-1,0); //end selecting
    


  • Ich denke, du hast mich falsch verstanden: ich meinte, dass du wohl bei FindWindowEx ein falsches Parent verwendet hast 😉



  • Wieso meinst du das?
    Ich benutze als Parent, ein Handle des ganzen ICQ Message Fensters. Daraus will ich dann als Child das RichEdit20A handlen. Habe ich denn da irgendwie was falsch verstanden?
    Könntest du mir vielleicht einen konkreten Hinweis geben wie ich es machen soll. Ich glaube so drehen wir uns im Kreis sind.
    Trotzdem vielen dank schon mal für deine bemühungen 👍



  • BlackSunrise schrieb:

    Wieso meinst du das?
    Ich benutze als Parent, ein Handle des ganzen ICQ Message Fensters. Daraus will ich dann als Child das RichEdit20A handlen. Habe ich denn da irgendwie was falsch verstanden?
    Könntest du mir vielleicht einen konkreten Hinweis geben wie ich es machen soll. Ich glaube so drehen wir uns im Kreis.
    Trotzdem vielen dank schon mal für deine bemühungen 👍



  • Ist denn das Edit ein direktes Child des Haupt-Fensters - hab gerade hier kein ICQ installiert...



  • Ich bin ein wenig weiter gekommen. Das RichEdit20A ist kein direktes Child vom Hauptfenster sondern erst kommt noch AfxOleControl42.

    Also habe ich nun folgedes probiert:

    HWND hwnd = FindWindow(0, "User (Invisible) - Message Session");
      SetForegroundWindow(hwnd);
      Sleep(50);
      HWND OleControl = FindWindowEx(hwnd,NULL,"AfxOleControl42",NULL);
      HWND richedit = FindWindowEx(OleControl,NULL,"RichEdit20A",NULL);
      EnableWindow(richedit,FALSE);
    

    Mache ich einen Zugriff zB. beim Wordpad wo auch ein RichEdit benutzt wird was direkt dem Hauptfenster zugeordnet ist klappt meine Methode. Also sollte es doch eigentlich auch der richtige weg sein?
    Anderes Problem ist, wie kann ich nachher Unterscheiden welches RichEdit ich bekomme? Es gibt leider 2 RichEdit20A die jeweils in einem AfxOleControl42 sind. 🙂



  • Wenn du nicht über die ID gehen willst / kannst, dann eben anhand der Reihenfolge (also das wievielte Child es ist) - dazu gibt es den Parameter hwndChildAfter bei FindWindowEx 😉



  • So als ich habs nun endlich geschafft 😃

    Meine Probleme war letztlich immer noch bei der Verschachtelung (RichEdit20A war zT. das 3. Child).
    Mit ChildAfter habe ich das nun auch endlich verstanden 🙂

    Also vielen dank soweit.
    Wenn einer fragen zuhat und Code sehen will soll er mich fragen 👍


Anmelden zum Antworten