Wie können Fokusänderungen überwacht werden?

8

Nun, manchmal tippe ich und sehr selten passiert es, dass etwas den Fokus stiehlt, ich lese eine Lösung (sogar eine VB Uhr), aber sie trifft nicht auf mich zu. Gibt es einen Windows-weiten "Griff", der ALLE Fokusänderungen behandelt?

Es ist egal in welcher Sprache, C, C ++, VB.NET, C #, Irgendetwas .NET oder Windows, Batch, Powershell, VBS Script ... Solange ich in der Lage bin jeden Fokuswechsel zu überwachen und logge es in ein Datei / cmd-Fenster / visuelles Fenster ein.

Etwas wie:

%Vor%

wäre sehr nützlich. Oder vielleicht gibt es dafür schon Tools (die ich nicht finden kann?)

    
nickhar 29.07.2012, 17:33
quelle

2 Antworten

14

Eine Möglichkeit wäre die Verwendung der Windows UI Automation API. Es macht ein globales Fokus-verändertes Ereignis verfügbar. Hier ist eine kurze Probe, die ich (in C #) gefunden habe. Beachten Sie, dass Sie Verweise auf UIAutomationClient und UIAutomationTypes hinzufügen müssen.

%Vor%     
mike z 29.07.2012, 21:04
quelle
1

Sie können Fokusänderungen mit einem Haken überwachen. SetWindowsHookEx (), das den WH_SHELL-Hook verwendet, wird es getan. Der Rückruf erhält die Benachrichtigung HSHELL_WINDOWACTIVATED.

Dies ist nicht einfach, insbesondere in einer verwalteten Sprache, da eine DLL benötigt wird, die injiziert werden kann. Noch konnte man zuverlässig den Unterschied zwischen einer beabsichtigten Fokusänderung oder einem Prozess erkennen, der das Fenster geschoben und den Fokus gestohlen hat. Welche Windows versucht zu verhindern, aber es gibt eine Hintertür namens AttachThreadInput (), die diesen Code täuscht.

Es ist nie schwierig zu sagen, welcher Prozess das tut. Immerhin hat es versucht, eines seiner Fenster zu aktivieren. Deinstallieren dieses Programm ist die einfachste und beste Lösung.

    
Hans Passant 29.07.2012 18:13
quelle

Tags und Links