Vordergrundfenster in Windows 2000



  • Ich habe ein Mini-C Programm das kein Fenster erzeugt und das mit ShellExecuteEx ein anderes Programm starten kann (den Namen für dieses Programm nehme ich aus dem dritten Parameter von WinMain()). Wenn ich das C-Programm selber starte, dann funktioniert alles reibungslos, d.h. das neu gestartete Programm ist aktiv (also ein Vordergrundfenster mit blauer Titelleiste). Starte ich das C-Programm jetzt jedoch indirekt von einer anderen Anwendung aus, die im Hintergrund läuft, so öffnet sich auch die neue Anwendung nur im Hintergrund (Bei Windows me war das nicht so, da war jede neu gestartete Anwendung eine Vordergrundanwendung).

    Der Witz dabei ist, dass wenn nach dem Ausführen von ShellExecuteEx das C-Proggi sofort mit return beendet wird, so startet jede Anwendung im Vordergrund. Werden jedoch weitere Funktionen danach ausgeführt, so entsteht wieder eine Hintergrundanwendung.

    Ich habe das ganz dann mal als normale Konsolenanwendung geschrieben, aus der immer Vordergrundanwednungen entstehen (eigentlich ganau richtig, nur die Konsole nervt).

    Also kann da jemand helfen. Es müsste irgendwie dahin führen, dass jede neu gestartete Anwendung automatisch im Vordergrund steht (und wie schon erwähnt, tritt das ganze nur bei Windows 2000 auf / vielleicht auch bei XP)

    int WINAPI WinMain(HINSTANCE hi, HINSTANCE hPrev, PSTR szCmdLine, int iCmd)
    {
    
     SHELLEXECUTEINFO sh;
     unsigned long *codeback;
    
     sh.cbSize = sizeof(sh);
     sh.fMask = SEE_MASK_NOCLOSEPROCESS;
     sh.hwnd = NULL;
     sh.lpVerb = "open";
     sh.lpFile = szCmdLine;
     sh.lpParameters = "";
     sh.lpDirectory = "";
     sh.nShow = 1;
    
     ShellExecuteEx(&sh);
    
     /* Stünde an dieser Stelle schon return, dann würde jede Anwendung im  
        Vordergrund ausgeführt.  */
    
     GetExitCodeProcess(sh.hProcess, codeback);
    
     while(*codeback == STILL_ACTIVE)
     {
      Sleep(100);
      GetExitCodeProcess(sh.hProcess, codeback);
     } 
    
     return(0);
    }
    


  • Was soll das denn geben - vielleicht können wir dir dann besser helfen 🙄



  • flenders schrieb:

    Was soll das denn geben - vielleicht können wir dir dann besser helfen 🙄

    Die Sache ist ein wenig komplex, und ich habs mir eigentlich auch nicht so schwer vorgestellt. Also: Ich arbeite auf einer IBM iSeries (AS/400), die ich mittels einer Terminal-Emulation über den PC bedienen kann. Mein Ziel ist es, mit einem Befehl von der iSeries ein Programm oder ein Dokument auf dem PC zu starten. Ich habe also mit der Programmiersprache RPG einen Client auf der iSeries programmiert, der einen Server (in Visual Basic geschrieben) auf den PC ansteuert. Dieser Server soll nun nach dem Empfang entsprechender Daten ein ganz noramles Programm starten. Das Problem dabei ist, dass die Terminal-Emulation ständig aktiv ist (also sie ist das aktive Fenster). Das vom Server gestartete Programm soll dieses Fenster überdecken. Was es allerdings in Windows 2000 nicht tut, weil der Server als Hintergrundprogramm läuft. Also habe ich mir dieses oberste Proggie zusammengeschrieben, das eigentlich jede neue Anwendung in den Vordergrund holen soll (Es wird also aus VB gestartet). Wie gesagt, bei einem C-Konsolenprogramm funktioniert das (die Konsole will ich aber nicht sehen). Bei einem Programm mit WinMain, verschwindet das daraus gestartete Programm (wie gewöhnlich) in den Hintergrund, es sei denn dass Hauptprogramm wird sehr schnell beendet (irgendwie paradox).

    Ich hoffe ihr habt es halbwegs mitbekommen was ich will und könnt helfen.



  • Schau Dir mal die Funktion AllowSetForegroundWindow an.

    Soweit ich es verstanden habe ist das Aufspringen von irgendwelchen Fenstern
    nicht mehr erwünscht denn:
    wer kennt es nicht.. man befindet sich gerade im Textverarbeitungsprogramm und
    hackt meterweise Text ein doch auf einmal springt mir irgendein
    Fenster aus einer anderen Anwendung entgegen, entreisst meinem Textverarbeitungsprogramm
    den Focus und verarbeitet die Zeichen die ich gerade tippe direkt als Eingabe ...
    Wer weiss was da alles passieren kann 😮

    Deshalb muss man in seiner Anwendung nun mit AllowSetForegroundWindow anderen Prozessen erlauben dass sie sich in den Vordergund setzen dürfen.

    Stellt sich nur noch die Frage wie man es der Terminalemulation beibringen
    kann so gütig zu sein ...

    Gruss d_A



  • Danke,
    die AllowSetForegroundWindow - Funktion kannte ich noch nicht. Ich glaube zwar nicht, dass ich sie auf die Emulation anwenden kann, aber deine Antwort half mir doch zum Verständnis 🙂



  • Hast du SetForegroundWindow denn aufgerufen (für das andere Fenster)?
    Also EnumWindows und dann dein Fenster suchen



  • flenders schrieb:

    Hast du SetForegroundWindow denn aufgerufen (für das andere Fenster)?
    Also EnumWindows und dann dein Fenster suchen

    SetForegroundWindow habe ich schon probiert. Die Titelleiste des aufzurufenden Fensters blinkt nur kurz. Das Fenster selber kommt dabei nicht in den Vordergrund.

    Es ist anscheinend tatsächlich so, dass ab Windows 2000 ein Programm es direkt erlauben muss andere Fenster in den Vordergrund zu lassen (eben mit AllowSetForegroundWindow). Der Terminal-Emulation kann ich das nicht "beibringen".

    Trotzdem Danke für die Antworten. Muss ich halt mit einem Konsolenprogramm auskommen, wobei ich die Konsole mit ShowWindow ganz schnell verschwinden lasse.


Anmelden zum Antworten