SPI_GETCURSORSHADOW 0x101A - проблема с получением логического значения - PullRequest
0 голосов
/ 17 января 2020

Ниже приведен код 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)

1 Ответ

1 голос
/ 17 января 2020

По документам :

SPI_GETCURSORSHADOW 0x101A

Определяет, имеет ли курсор тень вокруг него. Параметр pvParam должен указывать на переменную BOOL, которая получает TRUE, если тень включена, и FALSE, если она отключена. Этот эффект появляется, только если система имеет глубину цвета более 256 цветов.

Таким образом, ваша подпись неверна; третий параметр должен указывать на BOOL. Предполагая, что вам нужно только вызвать его для этого конкретного случая c, и нам не нужно беспокоиться об общем c IntPtr:

$CSharpSig = @'
  [DllImport("user32.dll")]
  public static extern bool SystemParametersInfo(
      int uiAction, uint uiParam, out bool pvParam, uint fWinIni);
'@

[bool] $BOOLTOGGLE = $false
if ($CursorRefresh::SystemParametersInfo($SPI_GETCURSORSHADOW, 0, [ref] $BOOLTOGGLE, 0)) {
    write-output $BOOLTOGGLE
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...