Windows에는 포커스 추적 마우스 ( "활성 창 추적")를 활성화하는 플래그가 있습니다.이 플래그는 괴물 "SystemParametersInfo" Win32 API 호출을 통해 쉽게 활성화 할 수 있습니다 . X-Mouse Controls 와 같이 플래그를 사용하도록 설정하는 타사 프로그램이 있거나 PowerShell을 사용하여 직접 호출을 수행 할 수 있습니다.
설명서에서 pvParam
인수가 어떻게 사용 되는지 항상 명확하지는 않으며 일부 Powershell 스 니펫 은이 특정 플래그를 설정할 때 값 자체가 아닌 값에 대한 포인터 를 잘못 전달합니다 . 이것은 항상으로 해석됩니다 true
. 즉, 실수로 플래그를 활성화하지만 다시 비활성화하지는 않습니다.
다음은 통화를 올바르게 수행하는 파워 쉘 스 니펫입니다. 또한 적절한 오류 검사가 포함되어 있으며, 간결함보다는 청결을 유지하려고 노력하고 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 )