Windows sebenarnya memiliki bendera untuk mengaktifkan fokus-mengikuti-mouse ("pelacakan jendela aktif"), yang dapat diaktifkan dengan mudah melalui panggilan API "SystemParametersInfo" Win32 yang luar biasa. Ada program pihak ketiga untuk mengaktifkan bendera, seperti Kontrol X-Mouse , atau Anda dapat melakukan panggilan secara langsung menggunakan PowerShell.
Dokumentasi tidak selalu super jelas tentang bagaimana pvParam
argumen digunakan, dan beberapa cuplikan PowerShell secara keliru melewatkan pointer ke nilai, bukan nilai itu sendiri, ketika mengatur flag tertentu ini. Ini akhirnya selalu ditafsirkan sebagai true
, yaitu mereka secara tidak sengaja berfungsi untuk mengaktifkan bendera, tetapi tidak untuk menonaktifkannya lagi.
Di bawah ini adalah cuplikan PowerShell yang melakukan panggilan dengan benar. Ini juga termasuk pemeriksaan kesalahan yang tepat, dan saya sudah mencoba untuk kebersihan daripada singkatnya, juga membuatnya lebih mudah untuk menambahkan pembungkus untuk fungsi lain SystemParametersInfo
, jika Anda menemukan beberapa yang menarik bagi Anda.
Shout-out ke pinvoke.net karena menjadi sumber yang bermanfaat untuk hal-hal seperti ini.
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 )