Guten Morgen allerseits,
ich arbeite gerade an einem all zu häufig bekanntem Problem. Dem Focus von Fenstern. Ich habe nun 3 Stunden und mehr damit verbracht, dieses Forum, Google und sonstige Quellen nach einer funktionierenden Lösung zu durchsuchen. Ich nutze Windows 7. Alle Lösungsansatze mit Win32API (SetForGroundWindow usw...) inklsuvie diverser verzweifelter .NET Methoden:
this.Focus(); // Focus auf Form setzen
this.TopMost = true;
this.textBox1.Focus(); // Focus auf Text setzen
this.textBox1.Select();
this.ActiveControl = this.textBox1;
this.BringToFront();
this.textBox1.BringToFront();
this.textBox1.Focus();
this.textBox1.ScrollToCaret();
schlugen viel. Ich bin mir relativ sicher, dass die Art und Weise wie ich sie angewendet habe, richtig war. Schließlich ist es mehr als ausreichend dokumentiert und von den vielen Beispielen wollen wir garnicht reden. Nichts desto trotz funktioniert es nicht. Mein Ziel ist folgendes:
Ich prüfe im Moment einen globalen Keyboard-Hook welcher tadellos funktioniert. In dem Moment wo ich eine Taste-Drücke, soll die TextBox1 auf meinem Form in den absoluten Focus geraten. Das tut sie grundsätzlich ja auch, erkannbar daran, dass der schwarze Strich blinkt. Der Focus liegt aber immer noch auf meinem anderen Fenster. Testweise meistens Notepad. Ich gebe also aktiv immer noch in Notepad Text ein. Ich wollte erst einfach über den Globla-Hook die Enter/Escape-Geschichten abfangen, macht aber im Nachhinein meines erachtens nach keinen Sinn. Ich kopiere den markierten Text, wenn ich also in nem Notepad etwas makriere und ENTER drücke dann ist es weg. Also nicht Sinn und Zweck der Übung.
Jetzt kommt ihr ins Spiel, wie bekomme ich den Focus vernünftig gelöst unter Windows 7? Ist übrigends nur eine Vermutung, muss nicht zwingend etwas mit Windows 7 zutun haben.
Danke!
Hi,
ich denke, daß liegt daran, daß du noch das Fenster deines eigenen Programms aktivieren mußt. Unter WinAPI geht dies mittels der SetForegroundWindow()-Funktion, d.h. von C# aus mittels P/Invoke: http://pinvoke.net/default.aspx/user32/SetForegroundWindow.html
Edit: seit WinXP wird dadurch jedoch nur das Window in der Taskbar "geflasht"
Evtl. mußt du dann BringWindowToTop() bzw. ShowWindow() probieren (oder in Kombination).
Ich bin mir aber generell nicht sicher, ob es unter Windows überhaupt noch machbar ist, ein Window programmgesteuert zu aktivieren (solange ein anderes Window aktiv ist und den Focus hat).