Gibt es Lösungen, um zu verhindern, dass Anwendungen den Fokus aus dem aktiven Fenster stehlen?
Dies ist besonders ärgerlich, wenn ich eine Anwendung starte, zu etwas anderem wechsle und die neue Anwendung einen halben Textsatz empfängt.
windows
window-focus
svandragt
quelle
quelle
This is especially annoying when I'm starting an application, switch to do something else and the new application starts receiving half a sentence of text.
Noch ärgerlicher ist es, wenn ein Dialogfeld angezeigt wird und Sie es unbeabsichtigt schließen, ohne die Nachricht zu sehen, weil Sie gerade gedrücktSpace
oderEnter
einen Satz eingegeben haben.Antworten:
Dies ist ohne umfangreiche Manipulation von Windows-Interna nicht möglich und Sie müssen darüber hinwegkommen.
Es gibt Momente im täglichen Computereinsatz, in denen es wirklich wichtig ist, dass Sie eine Aktion ausführen, bevor das Betriebssystem die Ausführung einer anderen zulässt. Dazu muss Ihr Fokus auf bestimmte Fenster fixiert werden. In Windows liegt die Kontrolle über dieses Verhalten weitgehend bei den Entwicklern der einzelnen Programme, die Sie verwenden.
Nicht jeder Entwickler trifft die richtigen Entscheidungen, wenn es um dieses Thema geht.
Ich weiß, dass das sehr frustrierend und nervig ist, aber Sie können Ihren Kuchen nicht haben und ihn auch essen. Es gibt wahrscheinlich viele Fälle in Ihrem täglichen Leben, in denen Sie vollkommen in Ordnung sind, wenn der Fokus auf ein bestimmtes Benutzeroberflächenelement oder eine Anwendung verschoben wird, in der der Fokus darauf verriegelt bleiben soll. Die meisten Anwendungen sind jedoch bei der Entscheidung, wer gerade die Nase vorn hat, ziemlich gleich und das System kann niemals perfekt sein.
Vor einiger Zeit habe ich ausführliche Nachforschungen angestellt, um dieses Problem ein für alle Mal zu lösen (und bin gescheitert). Das Ergebnis meiner Recherche finden Sie auf der Projektseite Ärger .
Das Projekt enthält auch eine Anwendung, die wiederholt versucht, den Fokus zu erreichen, indem sie Folgendes aufruft:
Wie wir aus diesem Snippet ersehen können, konzentrierte sich meine Forschung auch auf andere Aspekte des Verhaltens der Benutzeroberfläche, die mir nicht gefallen.
Ich habe versucht, dieses Problem zu lösen, indem ich in jeden neuen Prozess eine DLL geladen und die API-Aufrufe angehängt habe, die dazu führen, dass ein anderes Fenster aktiviert wird.
Der letzte Teil ist einfach, dank der hervorragenden API-Hooking-Bibliotheken. Ich habe die sehr gute mhook Bibliothek benutzt :
Bei meinen damaligen Tests hat das super geklappt. Mit Ausnahme des Teils des Ladens der DLL in jeden neuen Prozess. Wie man sich vorstellen kann, ist das nichts, was man zu leicht nehmen sollte. Ich habe damals den AppInit_DLLs- Ansatz verwendet (was einfach nicht ausreicht).
Grundsätzlich funktioniert das super. Aber ich habe nie die Zeit gefunden, etwas zu schreiben, das meine DLL richtig in neue Prozesse einfügt. Und die dafür aufgewendete Zeit überschattet größtenteils den Ärger, den der Fokusraub mir bereitet.
Neben dem DLL-Injection-Problem gibt es auch eine Focus-Stealing-Methode, die ich in der Implementierung von Google Code nicht behandelt habe. Ein Mitarbeiter hat tatsächlich zusätzliche Nachforschungen angestellt und sich mit dieser Methode befasst. Das Problem wurde auf SO diskutiert: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus
quelle
jne
?In Windows 7 wird der
ForegroundLockTimeout
Registrierungseintrag nicht mehr überprüft. Sie können dies mit Process Monitor überprüfen. In Windows 7 können Sie das Vordergrundfenster nicht ändern. Lesen Sie die Details , es gibt es sogar seit Windows 2000.Die Dokumentation ist jedoch beschissen und sie jagen sich gegenseitig und finden Wege , das zu umgehen .
Es ist also etwas mit Buggy los
SetForegroundWindow
, oder ähnliche API-Funktionen ...Die einzige Möglichkeit, dies wirklich richtig zu machen, besteht darin, eine kleine Anwendung zu erstellen, die in regelmäßigen Abständen aufruft
LockSetForegroundWindow
und alle Aufrufe unserer fehlerhaften API-Funktion praktisch deaktiviert.Wenn das nicht ausreicht (ein weiterer fehlerhafter API-Aufruf?), Können Sie noch weiter gehen und einige API-Überwachungen durchführen, um zu sehen, was vor sich geht. Anschließend schließen Sie die API-Aufrufe einfach an jeden Prozess an, nach dem Sie alle durcheinandergebrachten Aufrufe entfernen können der Vordergrund. Ironischerweise wird dies jedoch von Microsoft abgeraten ...
quelle
Es gibt eine Option in TweakUI, die dies tut. Es verhindert, dass die meisten der üblichen Tricks, die zweifelhafte Softwareentwickler anwenden, die Konzentration auf ihre App forcieren.
Es ist jedoch ein anhaltender Rüstungskrieg, daher weiß ich nicht, ob er für alles funktioniert.
Update : Laut EndangeredMassa funktioniert TweakUI unter Windows 7 nicht.
quelle
Ich glaube, dass es einige Verwirrung geben kann, da es zwei Möglichkeiten gibt, den Fokus zu stehlen: (1) ein Fenster, das in den Vordergrund tritt, und (2) das Fenster, das Tastenanschläge empfängt.
Das hier angesprochene Problem ist wahrscheinlich das zweite, bei dem ein Fenster den Fokus beansprucht, indem es sich in den Vordergrund rückt - ohne die Aufforderung oder Erlaubnis des Benutzers.
Die Diskussion muss hier zwischen XP und 7 aufgeteilt werden.
Windows XP
In XP gibt es einen Registry-Hack, durch den XP auf die gleiche Weise wie Windows 7 funktioniert und verhindert, dass Anwendungen den Fokus stehlen:
HKEY_CURRENT_USER\Control Panel\Desktop
.ForegroundLockTimeout
und setzen Sie den Wert hexadezimal auf30d40
.Windows 7
(Die folgende Diskussion bezieht sich hauptsächlich auch auf XP.)
Bitte haben Sie Verständnis dafür, dass Windows auf keine Weise verhindern kann, dass Anwendungen den Fokus stehlen und funktionsfähig bleiben. Wenn Ihr Antivirus beispielsweise während einer Dateikopie eine mögliche Bedrohung entdeckt und Sie in einem Fenster dazu auffordern möchte, eine Aktion auszuführen, werden Sie niemals verstehen, warum die Kopie niemals beendet wird, wenn dieses Fenster blockiert ist.
In Windows 7 ist nur eine Änderung des Verhaltens von Windows selbst möglich, nämlich die Verwendung der MS-Windows-Registrierungs-Hacks "Fokus folgt Maus" , wobei der Fokus und / oder die Aktivierung immer auf die Fenster unter dem Cursor gerichtet sind. Es kann eine Verzögerung hinzugefügt werden, um zu verhindern, dass Anwendungen auf dem gesamten Desktop angezeigt werden.
Siehe diesen Artikel: Windows 7 - Maus-Hover aktiviert das Fenster .
Andernfalls muss das schuldige Programm erkannt und neutralisiert werden: Wenn dies immer dieselbe Anwendung ist, die den Fokus erhält, ist diese Anwendung so programmiert, dass sie den Fokus erhält, und dies kann verhindert werden, indem entweder der Start des Computers deaktiviert wird oder Verwenden Sie eine von dieser Anwendung bereitgestellte Einstellung, um dieses Verhalten zu vermeiden.
Sie können das im VB-Code enthaltene VBS-Skript verwenden, das angibt, wer den Fokus stiehlt. Der Autor hat den Täter als "Call-Home" -Updater für eine Druckersoftware identifiziert.
Eine verzweifelte Maßnahme, wenn alles andere fehlschlägt und Sie diese schlecht programmierte Anwendung identifiziert haben, besteht darin, sie zu minimieren und zu hoffen, dass sie sich dann nicht in den Vordergrund rückt. Eine stärkere Form der Minimierung ist die Verwendung eines der in Best Free Application Minimizer aufgelisteten kostenlosen Produkte in der Taskleiste .
Die letzte Idee in der Reihenfolge der Verzweiflung besteht darin, Ihren Desktop virtuell zu beschädigen , indem Sie ein Produkt wie Desktops oder Dexpot verwenden und Ihre Arbeit auf einem anderen Desktop als dem Standarddesktop ausführen .
[BEARBEITEN]
Da Microsoft die Archive Gallery eingestellt hat, wird hier der oben genannte VB-Code wiedergegeben:
quelle
Alt-Tab
funktionieren. nur den Dialog nach vorne zwingen.Alt+Tab
Liste und meiner Erfahrung nach in einem solchen Fenster angezeigtAlt+Tab
Wenn ein modaler Dialog geöffnet ist, wird der modale Dialog nicht immer (nie?) angezeigt , insbesondere, wenn der Dialog nie geändert wurde, um den Fokus zu erhalten.:-|
Ghacks hat eine mögliche Lösung:
quelle
Inspiriert von der Antwort von Der Hochstapler habe ich beschlossen, einen DLL-Injektor zu schreiben, der sowohl mit 64- als auch mit 32-Bit-Prozessen funktioniert und das Stehlen von Fokus auf Windows 7 oder neuer verhindert: https://blade.sk/stay-focused/
Die Art und Weise, wie es funktioniert, besteht darin, dass es nach neu erstellten Fenstern (unter Verwendung von
SetWinEventHook
) sucht und eine DLL, die der von Der Hochstapler sehr ähnlich ist, in den Prozess des Fensters einfügt, falls diese noch nicht vorhanden ist. Es entlädt die DLLs und stellt die ursprüngliche Funktionalität beim Beenden wieder her.Nach meinen Tests funktioniert es bisher sehr gut. Das Problem scheint jedoch tiefer zu gehen als nur das Anrufen von Apps
SetForegroundWindow
. Wenn zum Beispiel ein neues Fenster erstellt wird, wird es automatisch in den Vordergrund gerückt, was auch die Eingabe eines Benutzers in ein anderes Fenster stört.Um mit anderen Methoden des Fokusdiebstahls fertig zu werden, sind weitere Tests erforderlich. Ich würde mich über Feedback zu Szenarien freuen, in denen dies geschieht.
quelle
Ich habe herausgefunden, wie die Taskleiste daran gehindert werden kann, ein neu aktiviertes Zielfenster zu flashen, nachdem Sie das Hauptfenster dieses Prozesses programmgesteuert von einem anderen Prozess aus aktiviert, maximiert und fokussiert haben. Erstens gibt es viele Einschränkungen, ob diese Operation zulässig ist.
Also , wenn der Controlling - Prozess im Vordergrund steht, kann es vorübergehend ermöglicht eine anderen Prozess vollständig in den Vordergrund zu stehlen , indem Aufruf AllowSetForegroundWindow mit der Prozess - ID des Zielprozesses. Danach kann der Zielprozess SetForegroundWindow selbst mit seinem eigenen Fenster-Handle aufrufen und es wird funktionieren.
Dies erfordert natürlich eine gewisse Koordination zwischen den beiden Prozessen, funktioniert jedoch, und wenn Sie dies tun, um eine Einzelinstanz-App zu implementieren, die alle Explorer-Klickstarts in die vorhandene App-Instanz umleitet, sind Sie bereits dabei Habe sowieso eine (zB) Named Pipe um Dinge zu koordinieren.
quelle