Laden...

Aktion davon abhängig machen, ob fremdes Fenster offen ist

Letzter Beitrag vor 13 Jahren 21 Posts 2.585 Views
Aktion davon abhängig machen, ob fremdes Fenster offen ist

Hallo liebe Community,

ich habe momentan mit Windows Forms ein Problem und zwar geht eine Funktion nicht in einem anderen Programm, aber dass nur so nebenbei, weil ich selber schon auf einen Lösungsweg gekommen bin aber nun keine Idee habe diesen umzusetzen:

Ich habe mir überlegt, dass ich eine Methode erstelle mit folgender Bedingung:

Wenn beide Programme A und B offen sind und der Programm B angeklickt (also aktiv) ist, soll Programm A solange pausieren und gerade die Hotkeys nicht beachten! Vielleicht noch zu erwähnen: Der Name des Programmes oben in der Leiste ändert sich nicht beim benutzen.

Beim Verlassen (anklicken eines anderen Fensters) sollten die Funktionen wieder aktiv sein.

Hat da jemand eine Idee? Habe jetzt auch schon im WWW schon geschaut und auch die Communitysuche hat leider keinen Erfolg gebracht.

Danke im Voraus

Mit freundlichen Grüßen

Setze einfach eine Variable die bei Activeted oder Deactived gesetzt wird.

Activated ==> true, Deactivated ==> false. Und bei deinen Hotkeys guckst du ob die Variable gerade true oder false ist.

Glaube aber deinen Text nicht ganz verstanden zu haben. Etwas verwirrend. Was soll das ganze denn bewirken? Vielleicht gibt es hier ja eine deutlich elegantere und bessere Lösung.

Danke schonmal für die schnelle Antwort!

Und zwar ist das so: Ich habe in meinem Programm (A), bei dem ich in eine Maske 2 Felder kopieren kann (nur Zahlen zugelassen). Das ganze funktioniert mit der F7 Taste. Dort werden also nun das erste Feld, dann ein Tabstop und dann das zweite Feld hineinkopiert.

Jetzt zum Problem: Wenn ich ein anderes Programm (B) offen habe scheint mein Programm A, das Programm B zu stören. Hierbei wird nun eine Funktion des Programmes B nicht beachtet (eine sehr wichtige).

Nun war meine Lösung die obrige, wenn du oder jemand anders eine bessere Lösung hat, kann er diese gerne sagen! Bin über alles dankbar, weil ich diesen Müll (nichts gegen C#, aber mich regt dieses Problem mittlerweile auf^^) bis nächste Woche fertig haben muss und ich total auf dem Schlauch stehe.

Also so wie ich es versteh ist oben genannte Lösung akzeptabel. Kannst glaube auch auf this.Active prüfen. Also einfach vor dem Hotkey abfangen schauen ob Programm A aktiv ist. Wenn ja dann Hotkeys abfangen, wenn Nein dann klappe halten.

ja nur wie schreibe ich dass: Falls (if, soweit weiß ich 😄) das Fenster offen ist, dass die Variable den Wert Activated bzw. true besitzt? Dafür habe ich keine Idee...

Das ist doch ein fremdes Programm, das du überwachen willst, oder?
Aber reicht dir nicht, deine Funktion zu aktivieren, wenn dein Fenster aktiviert wird, und zu deaktivieren, wenn dein Fenster deaktiviert wird? Das kannst über die Events Activated und Deactivate realisieren.

also geplannt war eigentlich dass sowas automatisch mit hilfe einer Schleife dann ausprobiert wird, wo er das ganze halt jede Sekunde überprüft.

Wenn ich keine Antworten erhalten solle, werde ich natürlich das probieren.

Weiter möglichkeit wäre mit dem hier:
GetForegroundWindow Function
Musst dann eben immer auf den prozess bzw. Handle überprüfen.
Und wenn ich nur nen tipp geben dürfte:
Ich nehm meistens nen timer für solche sachen, da hat man den stress mit neuem thread erstellen und sowas nich aber kamma natürlich auch anders machen.

Hallo Richman007,

ich habe gerade etwas in der user32.dll gesucht und bin auf folgendes gestoßen, hoffe es hilft dir weiter:


        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetForegroundWindow();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();        
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            foreach (Process proc in Process.GetProcesses())
            {
                if (proc.ProcessName.Contains("firefox"))
                {
                    if (proc.MainWindowHandle.Equals(GetForegroundWindow()))
                        this.Text = "true";
                    else
                        this.Text = "false";
                }
            }  
        }

PS: System.Diagnostics und System.Runtime.InteropServices natürlich nicht vergessen 😉

An Bugrick :
Genau das habe ich ja bereits angesprochen!

Danke für den Beitrag Bugrick, aber leider wird da ja so wie ich das sehe auf den Prozess geachtet. Das ist das Problem. Den leider sind BEIDE Fenster gleichzeitig offen 😃

Hallo Richman007,

mit Win32 EnumWindows (und ggf. zusätzlich EnumChildWindows) bekommst du alle offenen Fenster.

herbivore

ok, danke erstmal herbi, aber findet er damit auch das Fenster, welches man momentan aktiv offen hat?

Hallo Richman007,

das bekommst du, wie schon weiter oben gesagt, mit GetForegroundWindow. Und davon kann es immer nur eins geben. Du musst dich also entscheiden.

herbivore

oki doki, danke! Dann versuch ich mir mal was zusammenzubasteln 😃)))

Danke an ALLE! Falls noch jemand Tips hat kann er sie ja trotzdem schreiben 😉

hallo, nochmal ne frage, statt einem timer kann ich doch theoretisch auch einfach eine loop schleife einbauen oder?

Das geht nicht nur theoretisch sondern auch praktisch 😉

hallo, nochmal ne frage, statt einem timer kann ich doch theoretisch auch einfach eine loop schleife einbauen oder?

Ja - aber wozu?

Hallo Kamikaze,

Das geht nicht nur theoretisch sondern auch praktisch 😉

aber bei Windows-Forms-Anwendungen blockiert es dann (sowohl theoretisch als auch praktisch) das GUI und hat auch noch weitere Nachteile: Prozessorlast für den ausführenden Kern steigt auf 100% und die Dauer der Schleife hängt von der Prozessorgeschwindigkeit ab. Insgesamt also gar keine gute Idee. Daher mag deine Aussage theoretisch stimmen, praktisch ist leider sie irreführend. Timer sind hier das richtige.

herbivore

ok dann mache ich doch einen timer. is dann wohl wirklich sinnvoller.

Habe halt mit Timer noch nie gearbeitet, aber schon mit Loopschleife.

An alle wiedermal danke! 😉

@herbivore
Das ist mir schon klar.
Es war ja auch nur die Frage ob es theoretisch funktioniert.
Das der Timer eine bessere Wahl ist hätte ich vielleicht noch dazu schreiben sollen.