Steuerelemente aus fremden Programm ansprechen



  • Hallo

    Wie kann man die Steuerelemente aus einem Programm (dessen Name bekannt ist) auslesen.
    Hintergrund ist das beschreiben eines Texteditors.
    Alle Versuche dem Texteditor über folgenden Code zu beschreiben sind gescheitert.

    HWND hwnd = FindWindow(NULL, "Unbenannt - Editor");
    if(hwnd)
     {
      SetForegroundWindow(hwnd);
      SendMessage(hwnd,WM_SYSKEYDOWN, VK_SPACE, 0);
      SendMessage(hwnd,WM_SYSKEYUP, VK_SPACE, 0);
      SendMessageA(hwnd,WM_CHAR,'a',5);
      SendMessage(hwnd,WM_SYSKEYDOWN, VK_SPACE, 0);
     }
    

    Das drucken mit Str+P würde funkionieren (Code ist wonders geklaut :-))

    HWND hwnd = FindWindow(NULL, "Unbenannt - Editor");
    if(hwnd)
     {
      SetForegroundWindow(hwnd);     // Focus auf gewuenschtes Fenster setzen   
      keybd_event(0x11, 0, 0, NULL); // 'Strg' drücken 
      keybd_event(0x50, 0, 0, NULL); // 'p' drücken
      keybd_event(0x50, 0, KEYEVENTF_KEYUP, 0); //'p' loslassen
      keybd_event(0x11, 0, KEYEVENTF_KEYUP, 0); //'Strg' loslassen
     }
    

    Meine Vermutung ist das ich einfach so nicht an die Innereien des Editors komme.
    Am liebsten würd ich eine Liste von allen Innereien erzeugen lassen, um dann jedes einzelne aus probieren,
    ob ich da Tasten hin schicken kann.
    Hat jemand zufällig eine Lösung?
    Gibts da vielleicht ein Fokus-Problem?

    Danke



  • siehe FAQ, Du kannst das mit SendMessage nicht direkt lösen.



  • So wie es sich anhört geht es also.... 🙂



  • Hi,

    Steuerelement war wohl der falsche Ausdruck, besser ist wohl childWindow, obwohl ich gedacht hab, dass das MDI-Fenster sind.
    In der FAQ hab ich nichts gefunden!

    Im Forum hab ich ein Code gefunden den ich da vielleicht noch ein bisschen anpassen muss.
    Dafür brauch ich nochmal eure Hilfe. Bitte 🙂
    von (D)Evil
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-165984-and-start-is-10-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html

    #include <windows.h>

    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
    { 
    
     HWND hWndMessanger; 
          hWndMessanger = FindWindow(TEXT("MSBLWindowClass"), TEXT("Windows Live Messenger")); 
    
      if (hWndMessanger != NULL) 
      { 
    
        HWND hWndDirectUI = FindWindowEx(hWndMessanger, NULL, TEXT("DirectUIHWND"), NULL); 
    
        if (hWndDirectUI != NULL)
        {
    
          HWND hWndButton = FindWindowEx(hWndDirectUI, NULL, NULL, TEXT("Anmelden"));
          if(hWndButton != NULL)
          {
    
            SendMessage(hWndButton, WM_LBUTTONDOWN, 0, 0);
            SendMessage(hWndButton, WM_LBUTTONUP, 0, 0);
    
    } } } }
    

    Zeile 5: Text(MSBLWindowClass)? Und wie bekomme ich die Class heraus vom Editor?
    Zeile 10: der Parameter TEXT("DirectUIHWND")? woher bekomm ich den?

    Mir ist es klar, dass man mit FindWindow erst mal den oberKappo-Fenster braucht.
    Mit den nächsten FindWindowEx sucht man die einzelnen Ebenen ab.

    Gibt es irgendwo eine Liste von allen Möglichen Klassen, durch die man sich wühlen kann?

    Danke



  • So hab jetzt ein Programm gefunden,
    welches alle interessanten Sachen ausgibt. Handle | Windows-Text | Classname
    Das beste ist das es den API-C-Code ausgibt mit dem man an die Inerreien kommt.

    Es heißt X-Spy und gibt es hier

    http://www.x-spy.net/index.php?lang=de&site=downloads



  • ES GEHT!!!! 🙂
    hab die Klassnamen aus X-Spy heraus (nein den eigentlichen Code :-))

    HWND wnd;
    wnd =  FindWindow("Notepad", "Unbenannt - Editor");
    wnd =  FindWindowEx(wnd, 0, "Edit", NULL);
    if (wnd != 0)
     {
      SetForegroundWindow(wnd);
      SendMessageA(wnd,WM_CHAR,'a',5);
    }
    

    Weis nicht, ob es SendMessageA auch in der win32 gibt.
    (Borland c++ )


Anmelden zum Antworten