Windows thực sự có một cờ để kích hoạt chuột theo dõi tiêu điểm ("theo dõi cửa sổ hoạt động"), có thể dễ dàng kích hoạt thông qua lệnh gọi API Win32 "SystemParameterInfo" quái dị . Có các chương trình của bên thứ ba để bật cờ, chẳng hạn như Điều khiển chuột X hoặc bạn có thể thực hiện cuộc gọi trực tiếp bằng PowerShell.
Tài liệu này không phải lúc nào cũng rõ ràng về cách pvParam
sử dụng đối số và một số đoạn trích quyền hạn không chính xác chuyển một con trỏ đến giá trị, thay vì chính giá trị, khi đặt cờ cụ thể này. Điều này kết thúc luôn luôn được hiểu là true
, tức là họ vô tình làm việc để kích hoạt cờ, nhưng không phải để vô hiệu hóa nó một lần nữa.
Dưới đây là đoạn trích quyền hạn thực hiện cuộc gọi chính xác. Nó cũng bao gồm kiểm tra lỗi thích hợp và tôi đã cố gắng làm sạch hơn là ngắn gọn, để giúp dễ dàng thêm trình bao cho các chức năng khác SystemParametersInfo
, nếu bạn thấy một số điều mà bạn quan tâm.
Hét lên pinvoke.net vì là một tài nguyên hữu ích cho những thứ như thế này.
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 )