विंडोज में वास्तव में फोकस-फॉलो-माउस ("सक्रिय विंडो ट्रैकिंग") को सक्षम करने के लिए एक झंडा है, जिसे राक्षसी "SystemParametersInfo" Win32 API कॉल के माध्यम से आसानी से सक्षम किया जा सकता है । ध्वज को सक्षम करने के लिए तीसरे पक्ष के कार्यक्रम हैं, जैसे कि एक्स-माउस नियंत्रण , या आप सीधे PowerShell का उपयोग करके कॉल कर सकते हैं।
दस्तावेज़ हमेशा सुपर स्पष्ट नहीं होता है कि pvParam
तर्क का उपयोग कैसे किया जाता है, और कुछ अधिकार प्राप्त स्निपेट गलत तरीके से एक पॉइंटर पास करते हैं इस विशेष ध्वज को सेट करते समय से मूल्य के बजाय को करते हैं। इसका अर्थ हमेशा व्याख्या के रूप में होता है 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 )