Verhindern, dass Anwendungen den Fokus stehlen

105281
svandragt

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, etwas anderes mache und die neue Anwendung einen halben Satz Text erhält.

179
Vista oder XP? Seit Vista gibt es einige bekannte Probleme mit Problemumgehungen Ivo Flipse vor 14 Jahren 0
@Ivo Windows 7 in meinem Fall, aber ich denke, für SuperUser wären alle Windows-Versionen relevant svandragt vor 14 Jahren 9
XP hat eine bekannte Lösung und eine Frage http://superuser.com/questions/138648/how-to-disable-auto-focus-of-opened-windows-apps. Vielleicht sollte diese Frage nur für Windows 7 gelten? endolith vor 13 Jahren 0
Der Moderator führte diese Frage zusammen: http://superuser.com/questions/199821/windows-7-disable-applications-stealing-focus mit dem aktuellen. Dies ist falsch, die Antwort auf die aktuelle Frage gilt nicht für Windows 7 und sollte daher nicht zusammengeführt werden. Bisher konnte ich in Windows 7 keine Lösung für dieses Problem finden Alex Angelico vor 12 Jahren 2
@ AlejandroAngelico: Da alle Antworten hier für Windows-XP sind, sollten die Fragen aufgeteilt und die Frage neu markiert werden endolith vor 12 Jahren 0
@sathya ... als Referenz [dieses Forum] (http://answers.microsoft.com/de-de/windows/forum/windows_7-windows_programs/applications-stealing-focus-reg-key-no-longer/4ee5be7d -31ef-493b-b092-f6f6139f99cd) besagt, dass dies nicht möglich ist. Ich konnte den dort genannten Blog-Beitrag jedoch nicht finden. KronoS vor 12 Jahren 0
Dies ist einer meiner wichtigsten Haustier-Peeves mit jeder GUI, die ich jemals verwendet habe. Sie tippen und blamieren, einige Dialogboxen stehlen den Fokus und die Hälfte Ihrer Tastatureingaben geht woanders hin. Man könnte meinen, die Implementierer von Fenstersystemen hätten dies vor Jahrzehnten herausgefunden. Wenn ein Fenster aktiv ist, verzögern Sie die Belichtung des neuen Fensters. Sie können beispielsweise erst drei oder vier Sekunden nach dem letzten Klicken oder dem letzten Tastendruck im aktuell fokussierten Fenster auf der GUI auftauchen. Doh! Kaz vor 12 Jahren 16
Wenn ich meine externe Festplatte (von Seagate) oder meinen iPod nano (ähm, Apfel) an meinen Windows 7-Computer angeschlossen habe, habe ich festgestellt, dass der "Desktop" alle 30 Sekunden den Fokus stiehlt Ich surfte, sei es iTunes-Musik, Chrome-Suchergebnisse oder Firefox-E-Mails. Ich habe die Autoplay-Funktion deaktiviert, und das hat eine Weile geholfen, aber das Problem trat auch nach dem Deaktivieren der Autoplay-Funktion wieder auf. Ich denke, ich muss meine externen HD- und Flash-Laufwerke zum größten Teil getrennt halten, was nicht der Fall ist, wo all meine Musik ist :( Es ist ein wirklich nerviger Fehler, der mich dazu bringt, S zu wollen vor 11 Jahren 1
@ harrymc: Ja, ich habe mir alle Antworten angeschaut. Es scheint, dass es keine echte Lösung für Windows 7 gibt. endolith vor 11 Jahren 0
Siehe auch wirklich ausführliche Diskussionen zu diesem Thema [hier] (http://answers.microsoft.com/de-de/windows/forum/windows_7-windows_programs/applications-stealing-focus-reg-key-no-longer/4ee5be7d- 31ef-493b-b092-f6f6139f99cd). Karan vor 11 Jahren 0
`Das ist besonders ärgerlich, wenn ich eine Anwendung starte, etwas anderes mache und die neue Anwendung einen halben Satz Text erhält.“ Noch ärgerlicher ist es, wenn ein Dialog erscheint und Sie ihn unbeabsichtigt abweisen, ohne die Nachricht zu sehen weil Sie beim Eingeben eines Satzes zufällig die Leertaste oder die Eingabetaste gedrückt haben. Synetech vor 10 Jahren 18
Das Java-Installationsprogramm ist ein Beispiel. Ich kann während der Ausführung des Java-Installationsprogramms in mein IM-Fenster tippen und plötzlich wird mein Tastaturfokus weggerissen, da die Befehlszeile von Java das Eingabeaufforderungsfeld öffnet. Andere Installateure tun dies auch, sie können nicht einfach im Hintergrund laufen (ja, ich weiß, sie sagen immer "Alle Fenster zuerst schließen") - aber es gibt keinen Grund dafür - ich glaube, dass dies ein Relikt von XP ist vorhin). bgmCoder vor 7 Jahren 0
Das ist eigentlich mehr als nervig, ich würde sagen, dass es ein Sicherheitsrisiko ist. Es gibt nichts dagegen, dass eine Anwendung auftaucht, wenn Sie gerade ein Kennwort eingeben und Ihre Eingabe übernehmen. Chris Peacock vor 7 Jahren 2
@Synetech - Ja, insbesondere wenn es sich um eine Eingabeaufforderung "Windows jetzt neu starten, um Updates anzuwenden" handelt, die dann ohne Bestätigung und ohne Möglichkeit zum Abbruch erfolgt. Chris Peacock vor 7 Jahren 1

6 Antworten auf die Frage

45
Der Hochstapler

Dies ist ohne umfangreiche Manipulation der Windows-Interna nicht möglich und Sie müssen darüber hinwegkommen.

Im täglichen Gebrauch des Computers gibt es Momente, in denen es wirklich wichtig ist, dass Sie eine Aktion ausführen, bevor das Betriebssystem Ihnen eine andere Aktion erlaubt. Dazu muss der Fokus auf bestimmte Fenster beschränkt werden. In Windows ist dieses Verhalten weitgehend den Entwicklern der einzelnen von Ihnen verwendeten Programme überlassen.

Nicht jeder Entwickler trifft die richtigen Entscheidungen, wenn es um dieses Thema geht.

Ich weiß, dass dies sehr frustrierend und ärgerlich ist, aber Sie können Ihren Kuchen nicht essen und auch nicht 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 Oberflächenelement oder eine Anwendung verlagert wird, in der Sie aufgefordert werden, den Fokus darauf zu beschränken. Die meisten Anwendungen sind jedoch einigermaßen gleich, wenn es darum geht, zu entscheiden, wer gerade die Führungsrolle innehat, und das System kann niemals perfekt sein.

Vor einiger Zeit beschäftigte ich mich intensiv mit der Lösung dieses Problems ein für alle Mal (und ist gescheitert). Das Ergebnis meiner Recherche ist auf der Projektseite des Ärgernisses zu finden .

Das Projekt enthält auch eine Anwendung, die wiederholt versucht, den Fokus durch Aufruf aufzurufen:

switch( message ) { case WM_TIMER: if( hWnd != NULL ) { // Start off easy // SetForegroundWindow will not move the window to the foreground, // but it will invoke FlashWindow internally and, thus, show the // taskbar. SetForegroundWindow( hWnd );  // Our application is awesome! It must have your focus! SetActiveWindow( hWnd );  // Flash that button! FlashWindow( hWnd, TRUE ); } break; 

Wie wir an diesem Ausschnitt erkennen können, konzentrierte sich meine Forschung auch auf andere Aspekte des Benutzeroberflächenverhaltens, die mir nicht gefallen.

Ich habe versucht, dieses Problem zu lösen, indem ich in jeden neuen Prozess eine DLL lade und die API-Aufrufe einhakt, die ein anderes Fenster aktivieren.
Der letzte Teil ist dank der hervorragenden API-Hooking-Bibliotheken ganz einfach. Ich habe die sehr tolle mhook-Bibliothek benutzt :

#include "stdafx.h" #include "mhook-2.2/mhook-lib/mhook.h"  typedef NTSTATUS( WINAPI* PNT_QUERY_SYSTEM_INFORMATION ) (  __in SYSTEM_INFORMATION_CLASS SystemInformationClass,  __inout PVOID SystemInformation,  __in ULONG SystemInformationLength,  __out_opt PULONG ReturnLength  );  // Originals PNT_QUERY_SYSTEM_INFORMATION OriginalFlashWindow =  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress(  ::GetModuleHandle( L"user32" ), "FlashWindow" );  PNT_QUERY_SYSTEM_INFORMATION OriginalFlashWindowEx =  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress(  ::GetModuleHandle( L"user32" ), "FlashWindowEx" );  PNT_QUERY_SYSTEM_INFORMATION OriginalSetForegroundWindow =  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress(  ::GetModuleHandle( L"user32" ), "SetForegroundWindow" );  // Hooks BOOL WINAPI HookedFlashWindow( __in HWND hWnd, __in BOOL bInvert ) { return 0; }  BOOL WINAPI  HookedFlashWindowEx( __in PFLASHWINFO pfwi ) { return 0; }  BOOL WINAPI  HookedSetForegroundWindow( __in HWND hWnd ) { // Pretend window was brought to foreground return 1; }   BOOL APIENTRY  DllMain(  HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch( ul_reason_for_call ) { case DLL_PROCESS_ATTACH: Mhook_SetHook( (PVOID*)&OriginalFlashWindow, HookedFlashWindow ); Mhook_SetHook( (PVOID*)&OriginalFlashWindowEx, HookedFlashWindowEx ); Mhook_SetHook( (PVOID*)&OriginalSetForegroundWindow, HookedSetForegroundWindow ); break;  case DLL_PROCESS_DETACH: Mhook_Unhook( (PVOID*)&OriginalFlashWindow ); Mhook_Unhook( (PVOID*)&OriginalFlashWindowEx ); Mhook_Unhook( (PVOID*)&OriginalSetForegroundWindow ); break; } return TRUE; } 

Bei meinen Tests hat das gut funktioniert. Außer beim Laden der DLL in jeden neuen Prozess. Wie man sich vorstellen kann, ist das nichts zu leichtes. Ich habe damals den AppInit_DLLs- Ansatz verwendet (was einfach nicht ausreicht).

Grundsätzlich funktioniert das großartig. Ich habe jedoch nie die Zeit gefunden, etwas zu schreiben, das meine DLL ordnungsgemäß in neue Prozesse einfügt. Und die Zeit, die dafür aufgewendet wird, überschattet den Ärger, den das Focus-Stehlen verursacht.

Neben dem Problem mit der DLL-Injektion gibt es auch eine Methode zum Stehlen des Fokus, die ich bei der Implementierung von Google Code nicht behandelt habe. Ein Mitarbeiter hat tatsächlich einige Nachforschungen angestellt und diese Methode behandelt. Das Problem wurde auf SO besprochen: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus

Denken Sie, dass Ihre Lösung auf Java portiert werden könnte? Ich habe gesucht und Fragen gestellt, aber nichts gefunden. Vielleicht könnte ich die Hook-Bibliothek selbst mit 'jne' in Java importieren? Tomáš Zato vor 9 Jahren 0
@ TomášZato: Keine Ahnung. Ich benutze diesen Code nicht selbst aktiv. Der Hochstapler vor 9 Jahren 0
Ich versuche es zumindest als C ++ zu kompilieren (und dann die kompilierte DLL aus Java zu injizieren / zu entfernen). Aber das geht auch nicht gut. Ich möchte es hier nicht in Kommentaren besprechen, aber wenn Sie mir tatsächlich dabei helfen könnten, es zu schaffen, wäre ich sehr anmutig! Ich habe einen Chat-Raum erstellt. Wenn ich das verstehe, schreibe ich hier einen Kommentar dazu: http://chat.stackexchange.com/rooms/21637/preventing-applications-from-stealing-focus-using-mhook Tomáš Zato vor 9 Jahren 0
23
Tom Wijsman

In Windows 7 wird der ForegroundLockTimeoutRegistrierungseintrag nicht mehr geprüft. Sie können dies mit Process Monitor überprüfen. In Windows 7 können Sie das Vordergrundfenster nicht ändern. Lesen Sie mehr über die Details, seit Windows 2000 gibt es sie sogar.

Allerdings ist die Dokumentation scheiße und sie jagen sich gegenseitig und finden Wege, um das zu erreichen .

Also gibt es etwas Fehlerhaftes SetForegroundWindowoder ähnliche API-Funktionen ...

Der einzige Weg, dies wirklich richtig zu machen, besteht darin, eine kleine Anwendung zu erstellen, die in regelmäßigen Abständen aufruft LockSetForegroundWindow, wodurch Aufrufe der fehlerhaften API-Funktion praktisch deaktiviert werden.

Wenn das nicht genug ist (ein weiterer fehlerhafter API-Aufruf?), Können Sie noch weiter gehen und API-Überwachung durchführen, um zu sehen, was los ist. Dann hängen Sie einfach die API-Aufrufe an jeden Prozess an, nach dem Sie alle durcheinandergebrachten Aufrufe loswerden können der Vordergrund. Ironischerweise wird dies jedoch von Microsoft abgelehnt ...

Ich werde versuchen, eine Anwendung zu schreiben, die an diesem Freitag / Wochenende regelmäßig "LockSetForegroundWindow" aufruft. Da es bereits Fixes gibt, die für Windows XP und 7 funktionieren, erwarte ich nicht, dass irgendetwas für Windows 7 generisch funktioniert ... Tom Wijsman vor 12 Jahren 0
Hey Tom, vielleicht wird Ihnen dieses alte Projekt einen Vorsprung verschaffen :) http://code.google.com/p/annoyance/ Der Hochstapler vor 12 Jahren 0
@OliverSalzburg: Das weiß ich. Letzte Zeile in meinem Beitrag ... ^^ Tom Wijsman vor 12 Jahren 0
** Hat jemand einen reproduzierbaren Anwendungsfall in Windows 7? ** Da die Leute eher das Gegenteil erleben (zum Beispiel finde ich oft fordernde Windows hinter meinem aktuellen Fenster versteckt) und dass ich dies noch nicht gesehen habe In Windows 7 wäre es ziemlich ärgerlich, eine Anwendung zu schreiben, sie aber nicht testen zu können. Laut Microsoft sollte dies bei Windows 7 nicht mehr der Fall sein. Im besten Fall haben die Leute festgestellt, dass sie den Fokus der Tastatur nur aus Versehen ändern können. Dieser API-Aufruf würde das beheben, aber ich weiß nicht, wie sie testen kann, ob sie tatsächlich funktioniert. . Tom Wijsman vor 12 Jahren 3
Ich habe ein ähnliches Problem, das mich total nervt. Ein ziemlich komplexes Installationsprogramm, das während der Installation andere Programme aufruft (z. B. einige Dienstinitialisierung). Die Eingabe eines anderen Programms / Fensters während dieses letzten Teils der Installation ist nicht möglich. Es ist jedes Mal reproduzierbar, leider kann ich die beanstandete Anwendung nicht teilen. Ich wäre allerdings bereit, Ihren Workaround zu testen. Daniel Beck vor 12 Jahren 0
@DanielBeck: Hmm, welche Art von Fenstern erscheinen auf? Es wäre sehr interessant zu sehen, ob Konsolenfenster oder der * Windows Installer * selbst ihre eigenen Regeln verletzen würde. Es kann auch sein, dass neue Anwendungen die Regel umgehen können. Aber ich würde gerne wissen, ob es etwas Generisches ist, das sich als ein eigener Installer herausstellt, da dies etwas einfach zu reproduzieren wäre ... Tom Wijsman vor 12 Jahren 0
Das Installationsprogramm (basierend auf InnoSetup) startet andere Prozesse und möglicherweise andere (verborgene) Setups, aber ich weiß nicht, auf welchem ​​Setup-Ersteller sie basieren. Daniel Beck vor 12 Jahren 1
@ TomWijsman: Öffnen Sie regedit und suchen Sie nach zufällig ausgewähltem Text, der nicht gefunden werden kann. Gehen Sie in eine andere App und beginnen Sie mit der Eingabe. Wenn die Suche abgeschlossen ist, stiehlt regedit den Fokus. endolith vor 11 Jahren 5
@endolith: Nicht reproduzierbar, jedoch mit Windows 8 Replase Preview. Welches Betriebssystem verwendest du? In meinem Fall wird die Anwendung nur unten hervorgehoben, aber das Durchsuchen wird nicht unterbrochen. Tom Wijsman vor 11 Jahren 1
Auch unter Windows 7 nicht herstellbar ([bestätigt von Sathya] (http://chat.stackexchange.com/transcript/message/4857861#4857861)). Tom Wijsman vor 11 Jahren 0
@endolith Ich konnte es unter Windows 7 (64-Bit) reproduzieren. Siehe: http://chat.stackexchange.com/transcript/message/4858025#4858025 iglvzx vor 11 Jahren 1
@endolith: Ich denke, der erhöhte Prozess kann (zumindest unter Windows 7), obwohl Sathya das nicht konnte. Es macht irgendwie Sinn für Administratoren, dies zu tun ... Tom Wijsman vor 11 Jahren 1
Ja, Win7 Pro 64-Bit. Und Fokusstehlen ist für erhöhte Prozesse noch schlimmer, da sie Ihre Pressung erfassenWenn dies nicht der Fall ist, und Sie sagen, dass Sie Ihr System versehentlich verschließen sollten. Nichts sollte * niemals * den Fokus stehlen können. endolith vor 11 Jahren 21
@Tom: Es passiert mir regelmäßig (selbst wenn ich jetzt diesen Kommentar schreibe). Ich habe Windows 7 32 Bit. Im Hintergrund läuft eine Anwendung, die den untergeordneten Prozess durch Aufrufen von CreateProcess in regelmäßigen Abständen erstellt. Dieser untergeordnete Prozess tritt in den Vordergrund und stiehlt den Tastaturfokus. Aber nicht immer, sagen wir in 50% der Fälle. Die erwähnte Anwendung wird von mir und meinen Kollegen entwickelt. Ich habe nicht versucht, den Fokus zu stehlen, indem ich eine kleine Demoanwendung geschrieben habe, aber ich habe dieses Problem vielleicht hunderte Male gesehen. truthseeker vor 10 Jahren 1
Kopieren Sie etwas in Windows Explorer (zwischen Laufwerken, 1 GB, dauert 2-3 Minuten). Wenn das Kopieren abgeschlossen ist, stiehlt es den Fokus. Windows 7 Home Basic 64-Bit LGT vor 7 Jahren 0
18
Simon P Stevens

Es gibt eine Option in TweakUI, die dies tut. Es verhindert, dass die meisten üblichen Tricks, die dubiose Softwareentwickler einsetzen, um sich auf ihre App zu konzentrieren.

Es ist jedoch ein ständiger Waffenkrieg, daher weiß ich nicht, ob es für alles funktioniert.

Update : Laut EndangeredMassa funktioniert TweakUI nicht unter Windows 7.

Ist Tweakui mit Windows 7 kompatibel? frankster vor 14 Jahren 2
@frankster. Keine Ahnung, sorry, ich vermute, dass es wahrscheinlich nicht der Fall ist. Laden Sie es herunter und probieren Sie es aus. Melde dich zurück, wenn du es weißt. Simon P Stevens vor 14 Jahren 0
Die Verwendung der von TweakUI festgelegten Registrierungseinstellung funktioniert auch unter Win7 nicht. EndangeredMassa vor 13 Jahren 4
@EndangeredMassa Welcher Registrierungsschlüssel ist das? n611x007 vor 11 Jahren 0
Der Registrierungsschlüssel lautet HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout (in Millisekunden). Und ja, es funktioniert nicht mehr in Windows 7. foo vor 10 Jahren 1
`Es gibt eine Option in TweakUI, die dies tut. '* Welche * Option? Es gibt viel drin. Synetech vor 10 Jahren 0
14
harrymc

Ich glaube, dass einige Verwirrung bestehen 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 erhält.

Das Problem, auf das hier Bezug genommen wird, ist wahrscheinlich das zweite, bei dem ein Fenster den Fokus beansprucht, indem es sich selbst in den Vordergrund rückt - ohne die Anfrage oder Erlaubnis des Benutzers.

Die Diskussion muss hier zwischen XP und 7 aufgeteilt sein.

Windows XP

In XP gibt es einen Registrierungs-Hack, durch den XP genauso funktioniert wie Windows 7, um zu verhindern, dass Anwendungen den Fokus stehlen:

  1. Verwenden Sie regedit gehen Sie zu: HKEY_CURRENT_USER\Control Panel\Desktop.
  2. Doppelklicken Sie auf ForegroundLockTimeoutund setzen Sie den Wert in Hexadezimal auf 30d40.
  3. Drücken Sie OK und beenden Sie Regedit.
  4. Starten Sie Ihren PC neu, damit die Änderungen wirksam werden.

Windows 7

(Die folgende Diskussion gilt auch für XP.)

Bitte haben Sie Verständnis dafür, dass es keine Möglichkeit gibt, wie Windows Anwendungen vollständig daran hindern kann, den Fokus zu stehlen und funktionsfähig bleiben. Wenn zum Beispiel Ihr Antivirus während einer Dateikopie eine mögliche Bedrohung entdeckt hat und ein Fenster mit der Aufforderung zur Ausführung der Aktion aufrufen möchte. Wenn dieses Fenster blockiert ist, können Sie nie verstehen, warum die Kopie niemals beendet wird.

In Windows 7 ist nur eine Änderung des Verhaltens von Windows selbst möglich, nämlich die Verwendung der MS-Windows-Registrierungs-Hacks mit Fokus-Folgen-Maus, bei denen der Fokus bzw. die Aktivierung immer auf die Fenster unter dem Cursor gerichtet ist. Eine Verzögerung kann hinzugefügt werden, um zu verhindern, dass Anwendungen auf dem gesamten Desktop auftauchen.
Siehe diesen Artikel: Windows 7 - Maus-Hover macht Fenster aktiv - Aktivieren .

Andernfalls muss das schuldige Programm erkannt und neutralisiert werden: Wenn dies immer die gleiche Anwendung ist, die den Fokus erhält, dann ist diese Anwendung so programmiert, dass sie den Fokus erhält. Dies kann verhindert werden, indem entweder die Anwendung mit dem Computer deaktiviert wird oder Verwenden Sie eine Einstellung, die von dieser Anwendung bereitgestellt wird, um dieses Verhalten zu vermeiden.

Sie können das im VB-Code enthaltene VBS-Skript verwenden, das den Diebstahlschwerpunkt identifiziert, den der Autor verwendet hat, um den Täter als "Call Home" -Update für eine Druckersoftware zu identifizieren.

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 sich das dann nicht nach vorne bringt. Eine stärkere Form der Minimierung besteht in der Verwendung eines der kostenlosen Produkte, die im Best Free Application Minimizer aufgelistet sind .

Die letzte Idee in der Reihenfolge der Verzweiflung ist, Ihren Desktop virtuell zu zerbrechen, indem Sie ein Produkt wie Desktops oder Dexpot verwenden und Ihre Arbeit auf einem anderen Desktop als dem Standard ausführen .

[BEARBEITEN]

Da Microsoft die Archive Gallery zurückgezogen hat, wird hier der obige VB-Code wiedergegeben:

Declare Auto Function GetForegroundWindow Lib "user32.dll" () As Integer Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Integer, ByRef procid As Integer) As UInteger  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.RichTextBox1.AppendText("Starting up at " & Now & vbCrLf) End Sub  Private Sub GoingAway(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate, Me.LostFocus  Dim hwnd As Integer = GetForegroundWindow() ' Note that process_id will be used as a ByRef argument ' and will be changed by GetWindowThreadProcessId Dim process_id As Integer = 1 GetWindowThreadProcessId(hwnd, process_id)  If (process_id <> 1) Then Dim appExePath As String = Process.GetProcessById(process_id).MainModule.FileName()  Me.RichTextBox1.AppendText("Lost focus at " & Now & " due to " & appExePath & vbCrLf) Else Me.RichTextBox1.AppendText("Lost focus due to unknown cause.") End If  End Sub 
"Wenn dieses Fenster blockiert ist, würden Sie nie verstehen, warum die Kopie niemals abbricht." Das stimmt nicht. Das richtige Verhalten besteht darin, den Benutzer mit einem blinkenden Taskleistensymbol (oder möglicherweise einem Popup-Fenster oder einer Toaster-Benachrichtigung oder etwas anderem) zu benachrichtigen. Wenn der Benutzer mit einem Fenster unterbrochen wird, das seine Tastatureingaben abfängt, bedeutet dies, dass die Antivirensoftware angewiesen wird, die eine oder andere Aktion zufällig auszuführen. Auf keinen Fall ein guter Weg, Dinge zu tun. endolith vor 11 Jahren 43
Leider macht Windows das nicht in allen Fällen methodisch. Daher muss auf Workarounds oder Produkte von Drittanbietern zurückgegriffen werden. harrymc vor 11 Jahren 0
* "Wenn dieses Fenster blockiert ist, würden Sie nie verstehen, warum die Kopie niemals abbricht" Das stimmt nicht. Das korrekte Verhalten ist, den Benutzer mit einem blinkenden Taskleistensymbol zu benachrichtigen ... * Es gab Zeiten, in denen ich auf eine Schaltfläche oder etwas in einem laufenden Programm geklickt hat, durch die ein neues modales Dialogfeld erstellt wird (z. B. * open file *). , aber dann wechsle ich zu einem anderen Programm, bevor der Dialog erstellt wird. Dadurch wird der Dialog ausgeblendet und das andere Programm kann nicht umgeschaltet werden, und der Dialog kann nicht abgebrochen werden. Weder die Schaltfläche in der Taskleiste noch `Alt-Tab` funktioniert. nur den Dialog nach vorne zwingen. Synetech vor 11 Jahren 1
@ Synetech: Manchmal besteht die einzige Lösung für den Nicht-Front-Dialog darin, die Aufgabe zu beenden. Die Fokus-Algorithmen in Windows sind wirklich mies. harrymc vor 11 Jahren 1
@ harrymc, ich muss nie eine der Apps töten. Ich führe einfach mein Fenstermanipulationsprogramm aus ([WinSpy ++] (http://www.catch22.net/software/winspy-17) macht den Trick einfach toll) und blende das Fenster vor mir aus, dann kann ich das Zurückhalten verwerfen dann das verborgene Fenster wieder. Es ist nicht bequem, aber es ist besser, als einen der Prozesse zu töten. Synetech vor 11 Jahren 2
@Synetech: Es lässt etwas Dampf ab ... In aller Fairness reicht es normalerweise aus, Alt-Tab ein paar Mal zu wiederholen, um das Problem zu beheben. harrymc vor 11 Jahren 0
@harrymc, nicht wirklich; Das Beenden einer App und das Verlieren von Sachen macht einfach mehr Dampf, und wenn es sich um ein modales Dialogfeld handelt (das das übergeordnete Fenster sperrt und keine Taskleistenschaltfläche enthält), wird es nicht in der Liste "Alt + Tab" und in meiner angezeigt In einem Fenster, in dem ein modales Dialogfeld geöffnet ist, wird der modale Dialog mit `Alt + Tab` nicht immer angezeigt (nie?), insbesondere wenn sich das Dialogfeld nie geändert hat, um den Fokus zu erhalten. `: - |` Synetech vor 11 Jahren 1
Gibt es den VB-Code noch irgendwo? Der Link scheint gebrochen zu sein Superole vor 9 Jahren 0
@ Superole: Ich habe den Code zur Antwort hinzugefügt. harrymc vor 9 Jahren 0
@ harrymc: großartig :) jetzt, wenn ich nur herausfinden könnte, wie man es benutzt ... Ich habe versucht, es mit vbc zu kompilieren, aber "Sub Main" wurde nicht gefunden. Superole vor 9 Jahren 0
@Superole: Sie können auch andere Produkte verwenden, beispielsweise das Dienstprogramm AutoHotKey von Windows Spy. Oder verwenden Sie C # mit [diesem Programm] (http://adrianswall.com/?p=193). harrymc vor 9 Jahren 0
Gibt es eine Möglichkeit, den Fokus-Folgen-Maus-Gegenstand mit einem zweiten virtuellen unsichtbaren Mauszeiger zu missbrauchen, der folgt, wo momentan der Fokus liegt? endolith vor 9 Jahren 0
@endolith: AFAIK Es ist sehr schwer, unter Windows 2 Cursor zu haben. Ich schlage wirklich vor, nach einer anderen Lösung für Ihr Problem zu suchen, vielleicht in einem neuen Beitrag. harrymc vor 9 Jahren 0
Es wäre als Duplikat dieses Beitrags geschlossen endolith vor 9 Jahren 0
@endolith: Ich meinte eher das Grundproblem, das deine Lösung von 2 Cursorn motivierte. Es kann eine andere Lösung als 2 Cursor haben. harrymc vor 9 Jahren 0
Ich verstehe nicht Das Problem ist, dass Fenster auftauchen und den Fokus stehlen. Sie haben vorgeschlagen, dass der Fokus der Maus als Lösung folgt. Dies erfordert jedoch, dass Sie den Mauszeiger immer manuell über dem von Ihnen verwendeten Fenster bewegen. Ich frage mich, ob dies als Problemumgehung für diesen Windows-Fehler automatisiert werden kann. endolith vor 9 Jahren 0
@ Endolith: Vielleicht mit AutoHotKey oder ähnlichem. harrymc vor 9 Jahren 0
2
Ivo Flipse

Ghacks hat eine mögliche Lösung:

Es kommt mehrmals am Tag vor, dass einige Anwendungen den Fokus des aktiven Fensters stehlen, indem sie auftauchen. Dies kann aus verschiedenen Gründen geschehen, wenn ich zum Beispiel Dateien extrahiere oder eine Übertragung beendet wird. Meistens spielt es keine Rolle, wann dies passiert, aber manchmal schreibe ich einen Artikel und das bedeutet nicht nur, dass ich wieder einige Wörter eingeben muss, sondern auch, dass ich die Konzentration verloren habe und klicken muss, um den Fokus wiederzuerlangen.

Auf der Pro Reviewer- Website finden Sie Tipps, wie Sie dies verhindern können. Die einfachste Möglichkeit, das Diebstahl von Fokus zu verhindern, ist die Verwendung der Tweak-Benutzeroberfläche, deren Einstellung "Verhindern, dass Anwendungen den Fokus stehlen" genannt wird. Wenn Sie diese Option aktivieren, wird verhindert, dass andere Anwendungen plötzlich auftauchen und den Fokus des Fensters stehlen, in dem Sie gerade arbeiten.

Dies funktioniert nur, wenn die Anwendung zuvor minimiert wurde. Anstatt den Fokus zu stehlen, blinkt er mehrmals, was in demselben Menü in der Tweak-Benutzeroberfläche definiert werden kann . Wenn Sie die Tweak-Benutzeroberfläche nicht verwenden möchten, können Sie die Einstellung in der Windows-Registrierung ändern.

Navigieren Sie zum Registrierungsschlüssel HKEY_CURRENT_USER> Systemsteuerung> Desktop, und ändern Sie den Wert für ForegroundLockTimeout in 30d40 (Hexadecimal) oder 200000 (Decimal). Der Schlüssel ForeGroundFlashCount definiert die Anzahl der Blinkzeichen eines Fensters, um den Benutzer darauf hinzuweisen, dass 0 unbegrenzt bedeutet.

Dies funktioniert auf keinem Betriebssystem nach XP. Dieser Registrierungswert ist bereits auf diesen Wert festgelegt (ich glaube standardmäßig) und funktioniert trotzdem nicht. EndangeredMassa vor 13 Jahren 19
Nur zu zweit bin ich unter Windows 7 (64-Bit) und erlebe das Focus-Stealing (VS 2012, wenn es endlich aktiv ist, für ein Beispiel), und der obige Registrierungsvorschlag ist bereits vorhanden. Technische Bestätigung in dieser Antwort: http://superuser.com/a/403554/972 Michael Paulukonis vor 10 Jahren 0
0
blade

Inspiriert durch die Antwort von Der Hochstapler entschied ich mich, einen DLL-Injektor zu schreiben, der sowohl mit 64- als auch mit 32-Bit-Prozessen arbeitet und verhindert, dass Windows 7 oder neuer den Fokus auf Windows 7 oder höher stiehlt: https://blade.sk/stay-focused/

Die Funktionsweise besteht darin, dass sie auf neu erstellte Fenster SetWinEventHookachtet (using ) und DLL-Dateien, die der von Hochstapler sehr ähnlich sind, in den Prozess des Fensters injizieren, falls sie nicht bereits vorhanden sind. Es entlädt die DLLs und stellt beim Beenden die ursprüngliche Funktionalität wieder her.

Nach meinen Tests funktioniert es bisher sehr gut. Das Problem scheint jedoch tiefer zu gehen als nur das Aufrufen von Apps SetForegroundWindow. Wenn zum Beispiel ein neues Fenster erstellt wird, wird es automatisch in den Vordergrund gebracht, was auch die Eingabe eines Benutzers in ein anderes Fenster beeinträchtigt.

Um mit anderen Methoden des Fokusdiebstahls umzugehen, sind mehr Tests erforderlich, und ich würde mich über Feedback zu Szenarien freuen, in denen dies geschieht.