Windows verfügt tatsächlich über ein Flag zum Aktivieren der Fokus-Follow-Maus ("Active Window Tracking"), das über den monströsen Win32-API-Aufruf "SystemParametersInfo" problemlos aktiviert werden kann . Es gibt Programme von Drittanbietern, mit denen das Flag aktiviert werden kann, z. B. X-Mouse Controls , oder Sie können den Anruf direkt mit PowerShell ausführen.
Die Dokumentation ist nicht immer klar, wie das pvParam
Argument verwendet wird, und einige Powershell-Snippets übergeben beim Setzen dieses speziellen Flags fälschlicherweise einen Zeiger auf den Wert und nicht auf den Wert selbst. Dies wird letztendlich immer so interpretiert true
, dass sie versehentlich das Flag aktivieren, aber nicht wieder deaktivieren.
Unten ist ein Powershell-Snippet, das den Anruf korrekt ausführt. Es enthält auch eine ordnungsgemäße Fehlerprüfung, und ich habe versucht, eher auf Sauberkeit als auf Kürze zu achten, um auch das Hinzufügen von Wrappern für andere Funktionen zu vereinfachen SystemParametersInfo
, falls Sie einige finden, die Sie interessieren.
Shout-out zu pinvoke.net für eine hilfreiche Ressource für Sachen wie diese zu sein.
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
public static class Spi {
[System.FlagsAttribute]
private enum Flags : uint {
None = 0x0,
UpdateIniFile = 0x1,
SendChange = 0x2,
}
[DllImport("user32.dll", SetLastError = true)]
private static extern bool SystemParametersInfo(
uint uiAction, uint uiParam, UIntPtr pvParam, Flags flags );
[DllImport("user32.dll", SetLastError = true)]
private static extern bool SystemParametersInfo(
uint uiAction, uint uiParam, out bool pvParam, Flags flags );
private static void check( bool ok ) {
if( ! ok )
throw new Win32Exception( Marshal.GetLastWin32Error() );
}
private static UIntPtr ToUIntPtr( this bool value ) {
return new UIntPtr( value ? 1u : 0u );
}
public static bool GetActiveWindowTracking() {
bool enabled;
check( SystemParametersInfo( 0x1000, 0, out enabled, Flags.None ) );
return enabled;
}
public static void SetActiveWindowTracking( bool enabled ) {
// note: pvParam contains the boolean (cast to void*), not a pointer to it!
check( SystemParametersInfo( 0x1001, 0, enabled.ToUIntPtr(), Flags.SendChange ) );
}
}
'@
# check if mouse-focus is enabled
[Spi]::GetActiveWindowTracking()
# disable mouse-focus (default)
[Spi]::SetActiveWindowTracking( $false )
# enable mouse-focus
[Spi]::SetActiveWindowTracking( $true )