Laden...

SetForegroundWindow funktioniert nur einmalig

Erstellt von STF-DIR vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.510 Views
S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 4 Jahren
SetForegroundWindow funktioniert nur einmalig

Hallo,

nach langer Zeit habe ich mal wieder ein Problem, mit dem ich einfach nicht weiter komme.
Es ist auch etwas schwer zu erklären, aber ich hoffe ich kann es euch rüberbringen, so das ihr mir helfen könnt.

Also zur grundsätzlichen funktion:

Es gibt 3 Programme, ein FMC ( ganz links) den Prepar3D (mitte), und mein kleines Programm (rechts).
Über mein Programm kann ich die Türen an dem Flugzeug bedienen.
Das gleiche soll nun auch über das FMC gehen.

Funktionieren tut das ganz so, das ich in meinerm Programm auf einen Button für eine Tür drücke und dann wird diese geöffnet/geschlossen. Damit das aber funktioniert muss der Prepar3D den Focus haben, damit die Tastenkombination ( TAB+1 .. TAB+7) auch bei dem Prepar3d ankommt.

Wenn ich das ganze nun von meinem Programm mache, dann bekommt zuerst der Prepar3d den Focus:



        public static void ActivateApp(string processName)
        {
            Process[] p = Process.GetProcessesByName(processName);
            
            if (p.Count() > 0)
                SetForegroundWindow(p[0].MainWindowHandle);

        }

und dann wird die jeweilige Tastenkombination gesendet.

Funktioniert Super.

Nun kommt der komplizierte Teil:

Wenn ich das ganze über das FMC machen will, dann funktioniert das nur EIN MAL nachdem ich meini Program gestartet habe.
Dabei ist es auch egal, welches der Programme den Focus hat, das hab ich schon getestet.
Beende ich mein Programm, dann funktioniert es wieder ein mal und dann nicht mehr.
Ich hab das mal probiert und habe mein Programm, nachdem ich es das erste mal gestartet hatte, über den Prepar3d gelegt und dann im FMC eine Taste gedrückt. Danach sieht man wie mein Programm in den Hintergrund geht und der Prepar3d in den Focus kommt.
Das funktioniert aber nur ein mal ???

Also könnte man sagen, das der Code ansich funktioniert, aber nur genau ein mal.
Die Frage ist warum der gleiche Code nur einmal funktioniert???

Ich habe euch mal einen Screenshot von den 3 Programmen angehangen und hoffe ihr könnt helfen ?
Man sieht auf dem Bild auch, das in dem FMC ( ganz links ) eine "1" steht ( rot unterstrichen )
Das passiert, wenn ich im FMC versuche die Tür zu bedienen, NACHDEM es das erste mal funktioniert hatte. Nach dem ersten mal kommen die Tastenkombinationen dann nicht mehr im Prepar3D ( mittleres Fenster ) an, sondern das FMC behält sozusagen den Focus.

Ist etwas schwer zu erklären, hoffe ich konnte es einigermaßen verständlich rüber bringen?

Danke
Matthias

5.658 Beiträge seit 2006
vor 4 Jahren

Hier gibt es eine Erklärung und einige Workarounds: Issue with SetForegroundWindow in .NET

Weeks of programming can save you hours of planning

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 4 Jahren

Hello,

i tried the your solution and i also did a research for other solutions in this way, but nothing works.

Always, when i press the button in my App, then it works, but when i tried it from the other app ( FMC ) then it works only one times. When i tried it again it will not work.
I am running out of ideas whith all the ways to bring the Prepar3D window to focus.

Have you any other ideas ?

Matthias

4.939 Beiträge seit 2008
vor 4 Jahren

Überprüfe den Rückgabewert der Funktion SetForegroundWindow (den man generell bei WinAPI-Funktionen prüfen sollte).

PS: Warum auf englisch jetzt?

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 4 Jahren

Hallo,

keine Ahnung was mich mit dem englisch geritten hat, sorry.

Also SetForegroundwindow gibt beim ersten Versuch vom FMC aus TRUE und beim zweiten mal FALSE zurück.
Das Handle für den Prepar3d hab ich mir auch ausgeben lassen, das wird gefunden und ist auch das gleiche.

Komisch...

Wie bekommt man denn nun raus, warum das FALSE zurück gibt ??