Zwei "Speichern unter" Fenster gleichzeitig schließen



  • Hi, ich habe schon ein ganze Zeit im Forum gesucht und zwar auch ein paar Threads gefunden die ähnlich Themen behandeln (Messages an Fenster senden), aber irgendwie klappt das bei mir nicht.

    Zu meinem Problem:
    Ich habe zwei Programme offen, z.B. Word und Excel, und bei beiden die Fenster "Speichern unter". Nun möchte ich mit meinem Programm die beiden "Speichern unter" Fenster finden und den Button "Speichern" auslösen.

    Das suchen der "Speichern unter" Fenster habe ich mit FindWindowEx() gemacht:

    Danach versuche ich mit SendMessage() dem Fenster zu sagen, dass der Speichern Button gedrückt werden soll.

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    int main(int argc, char *argv[])
    {
    
        HWND wnd,bwnd;
    
        wnd = FindWindowEx(NULL,NULL,NULL,"Speichern unter");
    
        bwnd = FindWindowEx(wnd, NULL, TEXT("TButton"), "&Speichern"); 
        EnableWindow(bwnd,true);
        SendMessage(bwnd,WM_KEYDOWN,VK_RETURN, 1L);
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Allerdings springt mir das Programm nach dem ersten FindWindowEx raus, ohne den Rest abzuarbeiten und ich habe keinen Plan voran das liegen könnte.

    Jürgen



  • Ich nehme mal an, dass wnd NULL ist, da das "Speichern unter"-Fenster kein Top-Level-Fenster ist. Du musst dich also durch Mehrfach-Aufrufe von FindWindowEx bis zum Dialog durchhangeln. Aber laut Winspector Spy hat der Dialog auch gar keine Button-Controls (geschweige denn TButton) - keine Ahnung, wie der die Buttons behandelt 😕



  • vielleicht haben die das extra gemacht damit man den dialog nicht so einfach fernsteuern kann. 🤡

    Zum Thema Windowless Controls:
    http://weblogs.asp.net/oldnewthing/archive/2005/02/11/371042.aspx



  • sende doch einfach alt + s



  • alt + p bei mir 🤡



  • Erstmal Danke für die schnellen Antworten.

    Das mit Word und Excel sind nur Beispiele. Das soll nachher mit anderen Programmen genauso funktionieren. Wichtig ist, dass es zwei "Speichern unter" Fenster mit speichern beenden kann.

    Ich habe noch ein wenig rumgesucht und ausprobiert. Ich bekomme es jetzt hin, das mein Programm eines dieser Fenster mit "Speichern" schließt. Aber danach springt es immer zum Ende.

    HWND hwnd1 = FindWindowEx(NULL,NULL,NULL,"Speichern unter"); 
        if(hwnd1) 
        { 
           SetForegroundWindow(hwnd1); 
           keybd_event(VK_RETURN, 0, 0, 0); 
           keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); 
        } 
    
        HWND hwnd2 = FindWindowEx(NULL,NULL,NULL,"Speichern unter"); 
        if(hwnd2) 
        { 
    
           SetForegroundWindow(hwnd2); 
           keybd_event(VK_RETURN, 0, 0, 0); 
           keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); 
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    

    Damit finde ich die "Speichern unter" Fenster, aber nach dem ersten Aufruf von FindWindowEx() und Abarbeitung springt das Programm gleich zu system("PAUSE").

    Jürgen



  • Ich habe es jetzt selber hinbekommen. Das Problem war wahrscheinlich, dass das ganze zu schnell abgelaufen ist. Ich habe einfach zwischen die beiden FindWindowEx() ein Sleep() gesetzt und jetzt geht es.

    Jürgen



  • Auch wenn du es hinbekommen hast, obwohl es etwas fragwürdig aussieht, die fensterklasse der "Speichern" Schatlfläche ist bestimmt nicht TButton, es sei denn Microsoft hat die DLL mit einem Borlandprodukt und der VCL erstell, was ich aber kaum glaube.



  • @ Luckie: Das mit den TButton war eine Sache, die ich hier im Forum gefunden hatte. Nach ein wenig mehr suchen im Internet, habe ich dann eine andere Lösung gefunden. Das ist der Code, der über deinem Posting steht. Da ist auch nichts mehr mit TButton dabei.

    Hier noch einmal mein kompletter Coder:

    #include <windows.h>
    
    using namespace std;
    int main(int argc, char *argv[])
    {
        HWND hwnd1 = FindWindowEx(NULL,NULL,NULL,"Speichern unter"); 
        if(hwnd1) 
        { 
           SetForegroundWindow(hwnd1);                      
           keybd_event(VK_RETURN, 0, 0, 0);                  
           keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);   
        } 
        Sleep(20);                                          
        HWND hwnd2 = FindWindowEx(NULL,NULL,NULL,"Speichern unter"); 
        if(hwnd2) 
        { 
    
           SetForegroundWindow(hwnd2); 
           keybd_event(VK_RETURN, 0, 0, 0); 
           keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); 
        } 
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Jürgen



  • CainAdams schrieb:

    @ Luckie: Das mit den TButton war eine Sache, die ich hier im Forum gefunden hatte. Nach ein wenig mehr suchen im Internet, habe ich dann eine andere Lösung gefunden. Das ist der Code, der über deinem Posting steht. Da ist auch nichts mehr mit TButton dabei.

    wenn du dir über controls nicht sicher bist solltest du sowas
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcug98/html/_asug_home_page.3a_.spy.2b2b.asp
    oder
    http://www.windows-spy.com/
    benutzen 😉


Anmelden zum Antworten