Windows a en fait un indicateur pour activer le focus suivant la souris ("suivi de la fenêtre active"), qui peut être activé facilement via l'énorme appel API Win32 "SystemParametersInfo". Il existe des programmes tiers pour activer l'indicateur, tels que X-Mouse Controls, ou vous pouvez effectuer l'appel directement en utilisant PowerShell.
La documentation n'est pas toujours très claire sur la façon dont l'argument pvParam
est utilisé, et certains extraits de code PowerShell transmettent incorrectement un pointeur à la valeur, plutôt que la valeur elle-même, lors du réglage de cet indicateur particulier. Cela finit toujours par être interprété comme true
, c'est-à-dire qu'ils fonctionnent accidentellement pour activer l'indicateur, mais pas pour le désactiver à nouveau.
Ci-dessous se trouve un extrait de code PowerShell qui effectue l'appel correctement. Il inclut également une vérification d'erreur appropriée, et j'ai essayé d'opter pour la propreté plutôt que la brièveté, pour faciliter également l'ajout de wrappers pour d'autres fonctionnalités de SystemParametersInfo
, si vous en trouvez qui vous intéressent.
Mention spéciale à pinvoke.net pour être une ressource utile pour des choses comme celle-ci.
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 ) );
}
}
'@
# vérifier si le focus de la souris est activé
[Spi]::GetActiveWindowTracking()
# désactiver le focus de la souris (par défaut)
[Spi]::SetActiveWindowTracking( $false )
# activer le focus de la souris
[Spi]::SetActiveWindowTracking( $true )
1 votes
Une solution de contournement pour le problème n°1 est de cliquer sur la loupe (recherche) à la place. La touche de raccourci pour cela est Window + S.
1 votes
Vous pourriez être en mesure d'éviter le problème n°2 en définissant ActiveWndTrkTimeout sur une valeur plus élevée. WinAero Xmouse Tuner avait autrefois un minimum de 500 ms, mais il est maintenant réduit à un minimum de 100ms dans WinAero Tweaker en raison de demandes massives. Il n'est toujours pas possible de le réduire en dessous de 100 ms, mais il pourrait y avoir une bonne raison à cela.