System Windows ma flagę umożliwiającą aktywację myszy podążającej za myszą („aktywne śledzenie okna”), którą można łatwo włączyć za pomocą monstrualnego wywołania „ API SystemParametersInfo” Win32. Istnieją programy innych firm, aby włączyć flagę, takie jak X-Mouse Controls , lub możesz wykonać połączenie bezpośrednio za pomocą PowerShell.
Dokumentacja nie zawsze jest bardzo jasna na temat sposobu pvParamużywania argumentu, a niektóre fragmenty PowerShell niepoprawnie przekazują wskaźnik do wartości, a nie do samej wartości, podczas ustawiania tej konkretnej flagi. Ostatecznie zawsze jest to interpretowane jako true, tzn. Przypadkowo działają one w celu włączenia flagi, ale nie w celu jej ponownego wyłączenia.
Poniżej znajduje się fragment kodu PowerShell, który poprawnie wykonuje połączenie. Obejmuje to również prawidłowe sprawdzanie błędów, a ja starałem się raczej zachować czystość niż zwięzłość, aby ułatwić dodawanie opakowań dla innych funkcji SystemParametersInfo, jeśli znajdziesz takie, które Cię interesują.
Krzycz na pinvoke.net za bycie pomocnym źródłem takich rzeczy.
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 )