Windows, felaket "SystemParametersInfo" Win32 API çağrısı yoluyla kolayca etkinleştirilebilen fokus-takip eden fareyi ("aktif pencere izleme") etkinleştirmek için bir bayrağa sahiptir . X-Mouse Controls gibi bayrağın etkinleştirilmesini sağlayan üçüncü taraf programları var veya aramayı doğrudan PowerShell kullanarak yapabilirsiniz.
Belgeler, pvParam
bağımsız değişkenin nasıl kullanıldığı konusunda her zaman çok net değildir ve bazı powershell snippet'leri , bu belirli bayrağı ayarlarken değerin kendisine değil de değere yanlış bir işaretçi iletir . Bu, her zaman true
, örneğin bayrağa izin vermek için kazayla çalıştıkları, ancak tekrar devre dışı bırakmak için çalıştıkları şeklinde yorumlanıyor .
Aşağıda çağrıyı doğru şekilde yapan bir powershell pasajı gösterilmektedir. Ayrıca, uygun hata kontrolü de içerir ve kısalıklardan ziyade temizlik işine gitmeye çalıştım, ayrıca SystemParametersInfo
sizi ilgilendiren bazı işlevler için sarmalayıcılar eklemeyi kolaylaştırdı .
Böyle şeyler için yararlı bir kaynak olduğu için pinvoke.net'e not verin .
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 )