Насправді в Windows є прапор, що дозволяє ввімкнути мишкою фокус-слідку ("активне відстеження вікон"), яку можна легко ввімкнути через жахливий виклик API "SystemParametersInfo" Win32. Існують сторонні програми для включення прапора, такі як X-Mouse Controls , або ви можете здійснювати дзвінок безпосередньо за допомогою PowerShell.
Документація не завжди надзвичайно чітка щодо того, як використовується pvParamаргумент, і деякі фрагменти посилань невірно передають вказівник на значення, а не на саме значення при встановленні цього конкретного прапора. Це в кінцевому підсумку завжди трактується як true, тобто вони випадково працюють над включенням прапора, але не для того, щоб його знову відключати.
Нижче представлений фрагмент Powerhell, який виконує виклик правильно. Це також включає належну перевірку помилок, і я намагався піти на чистоту, а не на стислість, щоб також було легше додавати обгортки для іншої функціональності 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 )