Изменить и обновить размер курсора в Windows 10 через PowerShell - PullRequest
1 голос
/ 07 февраля 2020

Я написал код ниже, чтобы повлиять (как мне кажется) на единственные клавиши reg, отвечающие за размер курсора и указателя в Windows 10.

Вот код, который у меня есть до сих пор (Некоторые дополнительные комментарии в пределах):

$RegConnect             = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]"CurrentUser", "$env:COMPUTERNAME")
$RegCursorsAccess       = $RegConnect.OpenSubKey("Software\Microsoft\Accessibility", $true)
$RegCursorsControlPanel = $RegConnect.OpenSubKey("Control Panel\Cursors", $true)

# In the code below I'm trying to change the size of the cursor.

$RegCursorsControlPanel.SetValue("CursorBaseSize", 48)
$RegCursorsAccess.SetValue("CursorSize", 3)

$RegCursorsAccess.Close()
$RegConnect.Close()

# This section is where I thought it would update the cursor size.

# Here is where it lists stuff relating to setting and updating any settings changed.
# https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfoa
    # SPI_SETCURSORS
    # 0x0057
    # Reloads the system cursors. Set the uiParam parameter to zero and the pvParam parameter to NULL.

$CSharpSig = @'
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern bool SystemParametersInfo(
                  uint uiAction,
                  uint uiParam,
                  uint pvParam,
                  uint fWinIni);
'@
$CursorRefresh = Add-Type -MemberDefinition $CSharpSig -Name WinAPICall -Namespace SystemParamInfo -PassThru
$CursorRefresh::SystemParametersInfo(0x0057,0,$null,0)

Это изменит правильные значения в реестре.

Так что, если я буду запускать этот код PowerShell, размер мыши в удобстве доступа настройка имеет правильное значение.

cursor and pointer size setting

Но курсор не обновляется.

Как можно принудительно выполнить обновление без выхода из системы и повторного входа в систему или перезапуска аппарата.


Вот несколько связанных ссылок MS:

WM_SETTINGCHANGE сообщение

Функция SystemParametersInfoA


РЕДАКТИРОВАТЬ - Некоторая дополнительная информация

Если я запускаю Process Monitor из Sysinternals и копаю там глубоко, я это можно увидеть в сводке стека.

Это может привести кого-то более знающего, чем мне найти, как обновить размер мыши.

Секция HKCU\Control Panel\Cursors\(Default) SettingsHandlers_nt.dll

Sysinternals Process Monitor

И это также для раздела доступности. Windows.UI.Accessibility.dll

Windows.UI.Accessibility.dll

Вот настройки, которые я использовал в фильтре мониторов процесса, чтобы сузить элементы.

Settings used as the filter

1 Ответ

0 голосов
/ 07 февраля 2020

Но курсор не обновляется.

После изменения значения реестра требуется триггер, чтобы применить это обновление .

Это можно сделать с помощью функции SystemParametersInfo с SPIF_UPDATEINIFILE и SPIF_SENDCHANGE , чтобы записать новую общесистемную настройку параметров в профиль пользователя и передать сообщение WM_SETTINGCHANGE после обновления профиля пользователя.

SystemParametersInfo(SPI_SETCURSORS, 0, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);

Ниже приведен пример команды PowerShell:

$RegConnect = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]"CurrentUser","$env:COMPUTERNAME")


$RegCursors = $RegConnect.OpenSubKey("Control Panel\Cursors",$true)


$RegCursors.SetValue("","Windows Black")
$RegCursors.SetValue("CursorBaseSize",0x40)

$RegCursors.SetValue("AppStarting","%SystemRoot%\cursors\wait_r.cur")

$RegCursors.SetValue("Arrow","%SystemRoot%\cursors\arrow_rl.cur")

$RegCursors.SetValue("Crosshair","%SystemRoot%\cursors\cross_r.cur")

$RegCursors.SetValue("Hand","")

$RegCursors.SetValue("Help","%SystemRoot%\cursors\help_r.cur")

$RegCursors.SetValue("IBeam","%SystemRoot%\cursors\beam_r.cur")

$RegCursors.SetValue("No","%SystemRoot%\cursors\no_r.cur")

$RegCursors.SetValue("NWPen","%SystemRoot%\cursors\pen_r.cur")

$RegCursors.SetValue("SizeAll","%SystemRoot%\cursors\move_r.cur")

$RegCursors.SetValue("SizeNESW","%SystemRoot%\cursors\size1_r.cur")

$RegCursors.SetValue("SizeNS","%SystemRoot%\cursors\size4_r.cur")

$RegCursors.SetValue("SizeNWSE","%SystemRoot%\cursors\size2_r.cur")

$RegCursors.SetValue("SizeWE","%SystemRoot%\cursors\size3_r.cur")

$RegCursors.SetValue("UpArrow","%SystemRoot%\cursors\up_r.cur")

$RegCursors.SetValue("Wait","%SystemRoot%\cursors\busy_r.cur")

$RegCursors.Close()

$RegConnect.Close()


function Update-UserPreferencesMask {
$Signature = @"
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni);

const int SPI_SETCURSORS = 0x0057;
const int SPIF_UPDATEINIFILE = 0x01;
const int SPIF_SENDCHANGE = 0x02;

public static void UpdateUserPreferencesMask() {
    SystemParametersInfo(SPI_SETCURSORS, 0, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
}
"@
    Add-Type -MemberDefinition $Signature -Name UserPreferencesMaskSPI -Namespace User32
    [User32.UserPreferencesMaskSPI]::UpdateUserPreferencesMask()
}
Update-UserPreferencesMask

Но, к сожалению, обновление размера курсора не работает таким образом.

Обходной путь - использовать arrow_rl.cur (большое изображение) вместо arrow_r.cur.

См. Использование PowerShell для изменения схемы указателя мыши , Программно изменить пользовательский курсор мыши в windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...