Windows实际上具有一个启用焦点跟随鼠标(“活动窗口跟踪”)的标志,可以通过怪异的“ SystemParametersInfo” Win32 API调用轻松启用该标志。有第三方程序可以启用该标志,例如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 )