Ниже приведен код PowerShell, который я пытался написать, но не смог получить состояние тени курсора.
Я посмотрел здесь помощь: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfow
И в нем говорится, что:
SPI_GETCURSORSHADOW 0x101A
Определяет, имеет ли курсор тень вокруг него. Параметр pvParam должен указывать на переменную BOOL, которая получает TRUE, если тень включена, и FALSE, если она отключена. Этот эффект появляется, только если система имеет глубину цвета более 256 цветов.
Моя попытка кода, которую можно сохранить как файл .ps1 и протестировать в PS ISE
$CSharpSig = @'
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern bool SystemParametersInfo(
int uiAction, uint uiParam, uint pvParam, uint fWinIni);
'@
$SPI_GETCURSORSHADOW = 0x101A
$CursorRefresh = Add-Type -MemberDefinition $CSharpSig -Name WinAPICall -Namespace SystemParamInfo -PassThru
# SPI_GETCURSORSHADOW - pvParam 0 or 1 (3rd argument)
$CursorRefresh::SystemParametersInfo($SPI_GETCURSORSHADOW, 0, $BOOLTOGGLE, 0)
write-output $BOOLTOGGLE
Это возвращает False
как состояние все время, хотя это не так.
Я не знаю, как получить это даже после прочтения аналогичной темы, которая не связан напрямую с PowerShell: Перепутан с параметром SystemParametersInfo и логическим значением pvParam
Редактировать, новая проблема:
Мое полное намерение для код должен был попытаться переключить настройку для тени курсора, так что вот моя последняя попытка сделать это. Я поместил комментарии, относящиеся к проблеме, внутри кода.
Этот код работает для моей первоначальной проблемы, но не тогда, когда я добавляю обратно в прокомментированный код внизу.
# More info here: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfow
# Get the original setting
$CSharpSigGet = @'
[DllImport("user32.dll")]
public static extern bool SystemParametersInfo(
int uiAction, uint uiParam, out bool pvParam, uint fWinIni);
'@
$SPI_GETCURSORSHADOW = 0x101A
$CursorGet = Add-Type -MemberDefinition $CSharpSigGet -Name WinAPICall -Namespace SystemParamInfo -PassThru
[bool] $getBool = $false
$CursorGet::SystemParametersInfo($SPI_GETCURSORSHADOW, 0, [ref] $getBool, 0).value # Stores the boolean.
$cursorShadowBool = ([ref] $getBool).value
write-output $cursorShadowBool
# Toggle the original setting
# This code is now not working as it throws an error when this code below is uncommented..
# Error below:
# TYPE_ALREADY_EXISTS,Microsoft.PowerShell.Commands.AddTypeCommand
# $SPI_SETCURSORSHADOW = 0x101B
# $CSharpSigSet = @'
# [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
# public static extern bool SystemParametersInfo(
# int uiAction, uint uiParam, uint pvParam, uint fWinIni);
# '@
# $CursorSet = Add-Type -MemberDefinition $CSharpSigSet -Name WinAPICall -Namespace SystemParamInfo -PassThru
# $CursorSet::SystemParametersInfo($SPI_SETCURSORSHADOW, 0, -not ([ref] $getBool).value, 0)