Alexander (HH): Windows: Fenster soll nicht aktiv sein

Moin Moin!

Ich hab gerade das "Vergnügen", diverse alte Programme mit neuen Peripheriegeräten verkuppeln zu müssen. Dabei gibt es folgendes Problem:

Im Vordergrund läuft das Hauptprogramm, in das Benutzer Eingaben tippen sollen. Unter bestimmten Umständen muß ein Hilfsprogramm gestartet werden, um mit dem neuen Peripheriegerät kommunzieren zu können. Das Hilfsprogramm, eine Windows-Konsolenanwendung, wird dabei zum aktiven Fenster, selbst wenn ich es durch das Hauptprogramm minimiert starten lasse. Eingaben landen dann logischerweise nicht mehr im Hauptprogramm. Benutzer werden mit dieser Situation überfordert sein. (Ja, bei manchen unserer Benutzer sind wir froh, dass sie überhaupt die Buchstaben auf der Tastatur finden.)

Das Hilfsprogramm ist in C geschrieben, relevante Sources habe ich. Wie werde ich im Hilfsprogramm den Zustand des aktiven Fensters wieder los, so dass das zuvor(!) aktive Fenster mit dem Hauptprogramm wieder aktiv wird?

Das Hilfsprogramm sieht sinngemäß so aus:

  
#include <fette-runtime.h>  
#define WIN32_LEAN_AND_MEAN  
#include <windows.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <stdarg.h>  
#include <unistd.h>  
  
/* diverse Hilfsroutinen */  
  
int main(int argc, char ** argv)  
{  
    if (initialisiere_fette_runtime(argc,argv)) {  
        starte_runtime();  
    } else {  
        panic("oops, sollte nicht passieren")  
    }  
}  

Mir fehlt jetzt nur noch ganz am Anfang von main() ein ich_will_nicht_aktives_fenster_sein().

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  1. Tach!

    Das Hilfsprogramm, eine Windows-Konsolenanwendung,

    Hat es als solches überhaupt Ahnung von Fenstern und Focus?

    wird dabei zum aktiven Fenster, selbst wenn ich es durch das Hauptprogramm minimiert starten lasse.

    Im Tray starten lassen könnte ich mir vorstellen. Aber das wird sicher nicht mit Konsolenanwendungen klappen. Als Windows-Programm könnte vielleicht WS_EX_NOACTIVATE die Lösung sein. (Habs auch nur bei der Suche nach "windows start programm dont get focus" gefunden. Besser vielleicht nach "windows dont steal focus" suchen.)

    dedlfix.

    1. Moin Moin!

      Das Hilfsprogramm, eine Windows-Konsolenanwendung,

      Hat es als solches überhaupt Ahnung von Fenstern und Focus?

      Nö. Aber Windows verhindert nicht, dass ich die entsprechenden APIs (GetConsoleWindow() und ShowWindow()) nutze. Siehe https://forum.selfhtml.org/?t=210897&m=1438625.

      wird dabei zum aktiven Fenster, selbst wenn ich es durch das Hauptprogramm minimiert starten lasse.

      Im Tray starten lassen könnte ich mir vorstellen.

      Das gibt es in der Form einer einfachen API gar nicht, stattdessen versteckt man das Hauptfenster und bastelt sich ein Icon ins Tray.

      Aber das wird sicher nicht mit Konsolenanwendungen klappen.

      Doch, das geht auch mit Konsolenanwendungen, die sich eine eigene Message-Loop basteln.

      Als Windows-Programm könnte vielleicht WS_EX_NOACTIVATE die Lösung sein.

      Vielleicht, aber auf die Konsole hat man erst einmal nicht so viel Einfluß.

      Danke für die Hinweise.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  2. Für's Archiv:

    #define _WIN32_WINNT 0x0500

    vor

    #include <windows.h>

    und dazu

      
    void dontBeActiveWindow(void)  
    {  
        HWND conwnd=GetConsoleWindow();  
        if (conwnd!=NULL) {  
            ShowWindow(conwnd,SW_SHOWMINNOACTIVE);  
        }  
    }  
    
    

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Schade, das reicht nicht aus.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
      1. Moin Moin!

        Schade, das reicht nicht aus.

        Zusätzlich "cmd.exe /c start /min hilfsprogramm.exe" funktioniert. Was cmd.exe innerhalb von start beim Starten des Hilfsprogramms anders macht als das Hauptprogramm beim Kommando "starte Hilfsprogramm minimiert", will ich gar nicht wissen. Ich kann mit dem Zustand leben.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  3. Mir fehlt jetzt nur noch ganz am Anfang von main() ein ich_will_nicht_aktives_fenster_sein().

    Hmm, versuch das mal mit SW_SHOWNOACTIVATE bzw. SW_SHOWMINNOACTIVE, wobei du das dann auch gleich so im Hauptprogramm öffnen könntest.

    1. Moin Moin!

      Hmm, versuch das mal mit SW_SHOWNOACTIVATE bzw. SW_SHOWMINNOACTIVE,

      hab ich schon

      wobei du das dann auch gleich so im Hauptprogramm öffnen könntest.

      Im Hauptprogramm habe ich nahezu keinen Einfluß darauf, wie die Windows-API-Funktionen aufgerufen werden. An STARTUPINFO oder ähnliches komme ich definitiv nicht heran. Leider.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
      1. Moin Moin!

        Hmm, versuch das mal mit SW_SHOWNOACTIVATE bzw. SW_SHOWMINNOACTIVE,

        hab ich schon

        ok, hab ich vielleicht nicht deutlich gemacht, ich meinte dort

        "nCmdShow [in]
            Type: int
            Controls how the window is to be shown. This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure. Otherwise, the first time ShowWindow is called, the value should be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent calls, this parameter can be one of the following values. "

        1. Moin Moin!

          Hmm, versuch das mal mit SW_SHOWNOACTIVATE bzw. SW_SHOWMINNOACTIVE,

          hab ich schon

          ok, hab ich vielleicht nicht deutlich gemacht, ich meinte dort

          "nCmdShow [in]
              Type: int
              Controls how the window is to be shown. This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure. Otherwise, the first time ShowWindow is called, the value should be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent calls, this parameter can be one of the following values. "

          ShowWindow hab ich probiert. Hilft nicht.

          An STARTUPINFO komme ich nicht ran.

          Was an dem Stück Dokumentation meinst Du zu sehen, was ich nicht sehe?

          Alexander

          --
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          1. Was an dem Stück Dokumentation meinst Du zu sehen, was ich nicht sehe?

            "This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure."

            Also mal probieren ob
            ShowWindow(conwnd,SW_SHOWMINNOACTIVE);
            ShowWindow(conwnd,SW_SHOWMINNOACTIVE);
            hilft.

            1. Moin Moin!

              Was an dem Stück Dokumentation meinst Du zu sehen, was ich nicht sehe?

              "This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure."

              Auauauauauauaua! So'n Quatsch kann sich auch nur Microsoft ausdenken!

              Und ja, das hab ich nicht gesehen.

              Also mal probieren ob
              ShowWindow(conwnd,SW_SHOWMINNOACTIVE);
              ShowWindow(conwnd,SW_SHOWMINNOACTIVE);
              hilft.

              Das funktioniert tatsächlich.

              Danke!

              Alexander

              --
              Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  4. Kannst du nicht ein Fensterprogramm ohne Fenster draus machen?

    1. Hallo,

      Kannst du nicht ein Fensterprogramm ohne Fenster draus machen?

      klingt paradox, aber genau die Idee kam mir auch schon. Im Compiler/Linker einstellen, dass es eine Win32-GUI-Anwendung werden soll, aber einfach kein Anwendungsfenster erzeugen, sondern quasi-linear runterprogrammieren, als wenn's eine alte Konsolenanwendung wäre.

      Das setzt allerdings voraus, dass das Programm keine Interaktion mit dem Anwender nötig hat.

      Ciao,
       Martin

      --
      Wer es in einem Unternehmen zu etwas bringen will, muss so tun, als hätte er es schon zu etwas gebracht.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Om nah hoo pez nyeetz, Der Martin!

        Kannst du nicht ein Fensterprogramm ohne Fenster draus machen?

        klingt paradox, aber genau die Idee kam mir auch schon. Im Compiler/Linker einstellen, dass es eine Win32-GUI-Anwendung werden soll, aber einfach kein Anwendungsfenster erzeugen, sondern quasi-linear runterprogrammieren, als wenn's eine alte Konsolenanwendung wäre.

        Als ich noch Windows95-Einführungskurse unterrichtete, wurde auch über die (Bedien-)Elemente eines Fensters gesprochen. Nicht jedes Fenster muss jedes Element besitzen. Der Bildschirmschoner wurde immer als Minimalbeispiel dargestellt. Ob das aus Programmierersicht fachlich tatsächlich korrekt ist, weiß ich nicht. Einprägsam ist es auf jeden Fall.

        Matthias

        --
        1/z ist kein Blatt Papier.

        1. Wie genau meinst du das?
          Ich dachte an eine Anwendung die überhaupt kein Fenster erzeugt und nur ihre Arbeit im Hintergrund macht.

          1. Om nah hoo pez nyeetz, Encoder!

            Wie genau meinst du das?

            Für deine Aufgabe wird es dir sicher nicht helfen: Der Windowsbildschirmschoner ist ein Fenster ohne Bedienelemente.

            Matthias

            --
            1/z ist kein Blatt Papier.

      2. Tach.

        Kannst du nicht ein Fensterprogramm ohne Fenster draus machen?

        klingt paradox, aber genau die Idee kam mir auch schon.

        Ist ja auch nicht unüblich. Ich würde vermuten, daß die "Dienste" unter Windows das genauso machen.

        Im Compiler/Linker einstellen, dass es eine Win32-GUI-Anwendung werden soll, aber einfach kein Anwendungsfenster erzeugen, sondern quasi-linear runterprogrammieren, als wenn's eine alte Konsolenanwendung wäre.

        Genau, mit WinMain() statt main() als Entry Point.

        --
        Always remember that you are unique. Just like everybody else.
      3. Moin Moin!

        Kannst du nicht ein Fensterprogramm ohne Fenster draus machen?

        klingt paradox, aber genau die Idee kam mir auch schon. Im Compiler/Linker einstellen, dass es eine Win32-GUI-Anwendung werden soll, aber einfach kein Anwendungsfenster erzeugen, sondern quasi-linear runterprogrammieren, als wenn's eine alte Konsolenanwendung wäre.

        Das setzt allerdings voraus, dass das Programm keine Interaktion mit dem Anwender nötig hat.

        Tja, "normalerweise" soll das Hilfsprogramm nur ein braves Kind sein, still und leise in der Ecke sitzen und nicht weiter auffallen. Aber wie das mit Kindern nun mal ist, klappt das nicht immer. Eigentlich nie.

        Ich brauche wegen der benutzten Runtime zwingend eine "echte" Windows-Konsole, damit die Runtime ihre gelegentlichen Panik-Attacken ausleben kann(1), und in allerhöchster Not muß ein Hotline-Mitarbeiter die Benutzer vor Ort auch mal dazu bringen, ein oder zwei Sachen direkt ins Hilfsprogramm zu tippen und die Ergebnisse am Telefon vorlesen zu lassen.

        Ja, das ist letztlich Murks. Es ginge schöner und sauberer, aber dazu hätte man viel früher anfangen müssen zu planen, viel mehr alte Zöpfe abschneiden müssen, und auf Leute hören müssen, die Ahnung von Software-Entwicklung haben. Es ist, wie so oft, ein ziemlich fauler Kompromiss, mit dem wir die nächsten paar Jahre leben müssen, bis das "tolle" neue System kommt.

        Alexander

        (1) Exceptions werden nach stderr geschrieben. Punkt. Ende der Diskussion. Was passiert, wenn stderr nicht verfügbar ist? Will ich nicht wirklich wissen. Vermutlich noch eine Exception, deren Ausgabe daran scheitert, dass stderr nicht verfügbar ist, woraus eine weitere Exception folgt, bis die CPU schmilzt oder RAM und Swap voll sind.

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".