HWND für Edit-Control einer anderen Anwendung



  • Hi,

    ich möchte nach Drücken eines Hotkey's aus der aktiven Anwendung Text auslesen.

    Die Registrierung des Hotkeys und das Reagieren auf diesen funktioniert.
    Die aktive Anwendung erhält man mit GetForegroundWindow()
    Mit SendMessage(hWnd, EM_GetLine, line, lpch) wird man wohl auch eine Textzeile auslesen können.

    Mein Problem ist jetzt, daß ich nicht weiß wie man an das Handle des aktiven EditControl herankommt.

    Wer kann bitte helfe?

    snoopy_kmo 😕



  • Spontan hätte ich gesagt GetFocus. Aber das geht nicht, weil diese Funktion NULL liefert wenn das Fenster nicht zu deinem Thread gehört.
    In der Hilfe ist ein Link zu GetGUIThreadInfo. Damit scheint das zu gehen. 🙂



  • Vielen Dank für die schnelle Hilfe,

    aber.. um

    LPGUITHREADINFO lpgui; deklarieren zu können muß
    #include <winable.h> in die Headerdatei.

    Dann kommt die Fehlermeldung
    [C++ Fehler] winable.h(41): E2238 Bezeichner 'tagGUITHREADINFO' mehrfach deklariert.

    das sollte doch nicht passieren oder ??
    Ich benutze den C++Builder4



  • Just an Idea:
    Gugg mal im Spy++, wie das Control heisst.. Vielleicht kannst du anhand dessen über FindWindow() den Window-Handle ermittlen und da die Message hinsenden

    greetZ /*Andi*/



  • was ist Spy++ ??
    FindWindow() ist nicht mehr notwendig, da ich das Window-Handle über GetForegroundWindow() bereits habe. Aber ich brauche das Handle auf das Edit-Control innerhalb des ForegroundWindows.



  • Spy++ ist so ein Tool von Visual Studio (glaub ich). Damit kann man die ganzen Anwendungen ausspionieren :D.

    cya 🙂



  • FindWindowEx, das Edit muß aber ein direktes Child vom Hauptfenster sein. Ansonsten rekursiv mit EnumChildWindows durchgehen und das richtige finden.



  • Bei mir steht in der SDK-Hilfe:

    Use the GetForegroundWindow function to retrieve the handle to the window with which the user is currently working. You can associate your thread's message queue with the windows owned by another thread by using the AttachThreadInput function.

    Und mit AttachThreadInput() hatte ich auch schonmal erfolgreich gearbeitet. Geht gut.



  • Folgende Funktion z.B. schreibt den angegebenen Text in das FocusControl des Fensters im ersten Parameter:

    void TextSend(HWND hwnd, LPCTSTR text)
    {
      HWND hwndPrev  = GetForegroundWindow();
      SetForegroundWindow(hwnd);
    
      DWORD idAttach   = GetCurrentThreadId();
      DWORD idAttachTo = GetWindowThreadProcessId(hwnd, NULL);
      if( AttachThreadInput(idAttach, idAttachTo, TRUE) == FALSE )
         MessageBox(NULL, "ERROR: AttachThreadInput\(\)", "ERROR", MB_OK);
    
      HWND hwndFocus = GetFocus();
      if(hwndFocus)
         SendMessage(hwndFocus, WM_SETTEXT, 0, (LPARAM)text);
    
      if( AttachThreadInput(idAttach, idAttachTo, FALSE) == FALSE )
         MessageBox(NULL, "ERROR: AttachThreadInput\(\)", "ERROR", MB_OK);
    
      SetForegroundWindow(hwndPrev);
    }
    


  • Vielen Dank !!!!

    Das Programmbeispiel von WebFritzi funzt ohne jegliche Probleme.

    Nochmals Vielen Dank!!

    snoopy_kmo 🙂 🙂


Anmelden zum Antworten