В действительности, в Windows есть флаг для включения focus-follow-mouse («отслеживание активного окна»), который можно легко включить с помощью чудовищного вызова API-интерфейса Win32 «SystemParametersInfo» . Существуют сторонние программы для включения флага, такие как X-Mouse Controls , или вы можете выполнить вызов напрямую, используя PowerShell.
В документации не всегда очень ясно, как используется pvParamаргумент, и некоторые фрагменты powershell неправильно передают указатель на значение, а не само значение, при установке этого конкретного флага. Это всегда интерпретируется как true, то есть они случайно работают для включения флага, но не для его отключения снова.
Ниже приведен фрагмент PowerShell, который выполняет вызов правильно. Он также включает в себя надлежащую проверку ошибок, и я попытался сделать ставку на чистоту, а не на краткость, чтобы упростить добавление упаковщиков для других функций SystemParametersInfo, если вы найдете то, что вас интересует.
Кричите-к pinvoke.net для того , чтобы быть полезным ресурсом для вещей , как это.
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 )