Windows a en fait un indicateur pour activer focus-follow-mouse ("suivi de fenêtre actif"), qui peut être activé facilement via le monstrueux appel d'API Win32 "SystemParametersInfo" . Il existe des programmes tiers pour activer l'indicateur, tels que les contrôles de la souris X , ou vous pouvez effectuer l'appel directement à l'aide de PowerShell.
La documentation n'est pas toujours très claire sur la façon dont l' pvParam
argument est utilisé, et certains extraits PowerShell transmettent à tort un pointeur sur la valeur, plutôt que la valeur elle-même, lors de la définition de cet indicateur. Cela finit toujours par être interprété comme true
, c.-à-d. Qu'ils travaillent accidentellement pour activer le drapeau, mais pas pour le désactiver à nouveau.
Vous trouverez ci-dessous un extrait de code PowerShell qui exécute correctement l'appel. Cela inclut également la vérification correcte des erreurs, et j’ai essayé d’opter pour la propreté plutôt que la concision, afin de faciliter l’ajout d’emballages pour d’autres fonctionnalités de SystemParametersInfo
, si vous en trouviez qui vous intéressaient.
Merci à pinvoke.net d’être une ressource utile pour ce genre de choses.
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 )