Windows มีการตั้งค่าสถานะเพื่อเปิดใช้งานการโฟกัสตามเมาส์ ("การติดตามหน้าต่างที่ใช้งานอยู่") ซึ่งสามารถเปิดใช้งานได้อย่างง่ายดายผ่านการเรียก Win32 API "SystemParametersInfo" อันยิ่งใหญ่ มีโปรแกรมบุคคลที่สามเพื่อเปิดใช้งานการตั้งค่าสถานะเช่นการควบคุม X-Mouseหรือคุณสามารถทำการโทรโดยตรงโดยใช้ PowerShell
เอกสารไม่ชัดเจนในการใช้pvParam
อาร์กิวเมนต์เป็นพิเศษเสมอและบางตัวอย่าง PowerShell ส่งผ่านตัวชี้ไปยังค่าอย่างไม่ถูกต้องแทนที่จะเป็นค่าตัวเองเมื่อตั้งค่าสถานะเฉพาะนี้ สิ่งนี้สิ้นสุดลงเมื่อถูกตีความว่าเป็นtrue
เช่นนั้นพวกเขาทำงานโดยไม่ได้ตั้งใจสำหรับการเปิดใช้งานธง แต่ไม่ได้สำหรับการปิดการใช้งานอีกครั้ง
ด้านล่างเป็นตัวอย่างข้อมูล PowerShell ที่ดำเนินการโทรอย่างถูกต้อง นอกจากนี้ยังรวมถึงการตรวจสอบข้อผิดพลาดที่เหมาะสมและฉันพยายามทำความสะอาดมากกว่าความกะทัดรัดเพื่อให้ง่ายต่อการเพิ่ม wrappers สำหรับฟังก์ชั่นอื่น ๆ ของ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 )