Laden...

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

Erstellt von Richman007 vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.520 Views
R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren
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

B
193 Beiträge seit 2009
vor 12 Jahren

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.

R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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.

B
193 Beiträge seit 2009
vor 12 Jahren

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.

R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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...

C
1.214 Beiträge seit 2006
vor 12 Jahren

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.

R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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.

U
189 Beiträge seit 2011
vor 12 Jahren

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.

_
48 Beiträge seit 2011
vor 12 Jahren

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 😉

U
189 Beiträge seit 2011
vor 12 Jahren

An Bugrick :
Genau das habe ich ja bereits angesprochen!

R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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 😃

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Richman007,

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

herbivore

R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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

49.485 Beiträge seit 2005
vor 12 Jahren

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

R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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

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

R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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

K
111 Beiträge seit 2006
vor 12 Jahren

Das geht nicht nur theoretisch sondern auch praktisch 😉

5.742 Beiträge seit 2007
vor 12 Jahren

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

Ja - aber wozu?

49.485 Beiträge seit 2005
vor 12 Jahren

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

R
Richman007 Themenstarter:in
17 Beiträge seit 2011
vor 12 Jahren

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! 😉

K
111 Beiträge seit 2006
vor 12 Jahren

@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.