Вопрос или проблема
Мне нужно иметь возможность мгновенно вручную отключать экран.
Я попробовал powercfg /change monitor-timeout-ac 0, но похоже, что установка значения 0 переводит его на “никогда”. Значения такие как 0.1 также меняют его на “никогда”.
Есть ли способ установить это значение на 0 минут, или есть ли другая команда, которую я могу использовать для ручного отключения экрана?
С этой страницы скриптов TechNet:
powershell (Add-Type '[DllImport(\"user32.dll\")]^public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)
(Запуск этой команды также блокирует рабочую станцию в Windows 10. Вам нужно будет знать пароль, чтобы войти обратно)
Запуск в Powershell:
(Add-Type '[DllImport("user32.dll")]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)
Будет правильным ответом для отключения дисплея. Да, это также отключает дисплей на ноутбуке с использованием Powershell (и некоторого кода .NET C#)
Предыдущие решения работают, но они блокируют ввод в powershell.
Другой подход, чтобы сохранить ввод в powershell активным, это использование PostMessage
вместо SendMessage
.
(Add-Type "[DllImport(""user32.dll"")] public static extern int PostMessage(int hWnd, int hMsg, int wParam, int lParam);" -Name "Win32PostMessage" -Namespace Win32Functions -PassThru)::PostMessage(0xffff, 0x0112, 0xF170, 2)
Проверено на Win10 и работает
(Add-Type -MemberDefinition "[DllImport(""user32.dll"")]`npublic static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);" -Name "Win32SendMessage" -Namespace Win32Functions -PassThru)::SendMessage(0xffff, 0x0112, 0xF170, 2)
DisplayConfig – это то, что нужно использовать!
Для других людей, которые найдут этот пост, вот обходное решение:
Установите модуль DisplayConfig: PowerShell Gallery | DisplayConfig
Получите информацию о вашем дисплее (обратите внимание на ID монитора): Get-DisplayInfo
Вы должны получить что-то вроде этого:
PS C:\Users\user1> Get-DisplayInfo
DisplayId DisplayName Active Primary Position Mode ConnectionType --------- ----------- ------ ------- --------
---- --------------
1 PHL 272V8 True True 0 0 1920x1080@74,973 Hz DisplayPort
2 Mi Monitor True False 1920 0 3440x1440@144 Hz DisplayPort
3 Philips UHDTV False False 0 0 HDMI
Вы можете получить список команд, используя Get-Command -Module DisplayConfig
PS C:\Users\user1> Get-Command -Module DisplayConfig
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Copy-DisplaySource 1.0.5 DisplayConfig
Cmdlet Disable-Display 1.0.5 DisplayConfig
Cmdlet Disable-DisplayAdvancedColor 1.0.5 DisplayConfig
Cmdlet Enable-Display 1.0.5 DisplayConfig
Cmdlet Enable-DisplayAdvancedColor 1.0.5 DisplayConfig
Cmdlet Get-DisplayColorInfo 1.0.5 DisplayConfig
Cmdlet Get-DisplayConfig 1.0.5 DisplayConfig
Cmdlet Get-DisplayInfo 1.0.5 DisplayConfig
Cmdlet Get-DisplayProfile 1.0.5 DisplayConfig
Cmdlet Get-DisplayScale 1.0.5 DisplayConfig
Cmdlet Set-DisplayPosition 1.0.5 DisplayConfig
Cmdlet Set-DisplayPrimary 1.0.5 DisplayConfig
Cmdlet Set-DisplayProfile 1.0.5 DisplayConfig
Cmdlet Set-DisplayRefreshRate 1.0.5 DisplayConfig
Cmdlet Set-DisplayResolution 1.0.5 DisplayConfig
Cmdlet Set-DisplayRotation 1.0.5 DisplayConfig
Cmdlet Set-DisplayScale 1.0.5 DisplayConfig
Cmdlet Undo-DisplayConfigChanges 1.0.5 DisplayConfig
Cmdlet Use-DisplayConfig 1.0.5 DisplayConfig
Чтобы отключить любой экран, используйте команду Disable-Display [ID]
Чтобы включить любой экран, используйте команду Enable-Display [ID]
это работает идеально,
powershell -command $obj = Add-Type -MemberDefinition ‘[DllImport(“”””user32.dll””””)] public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);’ -Name fn -Namespace ns -PassThru; $obj::SendMessage(0xffff, 0x0112, 0xF170, 2)
но после того, как монитор включается, окно PS остается открытым. “Пробовал добавить команду “exit”, но это не сработало.
Можете помочь, пожалуйста?
Ответ или решение
Отключение экрана с помощью PowerShell
Если вы хотите быстро отключить экран вашего компьютера с помощью PowerShell, существует несколько подходов. В данном руководстве мы рассмотрим несколько методов, которые позволят вам сделать это эффективно.
Метод 1: Использование SendMessage
Одним из наиболее распространенных способов отключения экрана является использование функции SendMessage
из библиотеки user32.dll
. Этот метод также включает блокировку рабочего стола, поэтому вам потребуется ввести пароль для разблокировки.
Вот команда, которую вы можете использовать:
Add-Type '[DllImport("user32.dll")]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -PassThru)::SendMessage(-1, 0x0112, 0xF170, 2)
Примечание
Этот метод также работает на ноутбуках и различных конфигурациях дисплеев.
Метод 2: Использование PostMessage
Если вам нужно сохранить возможность вводить команды в PowerShell после отключения экрана, вы можете использовать PostMessage
. Команда выглядит следующим образом:
Add-Type "[DllImport(""user32.dll"")] public static extern int PostMessage(int hWnd, int hMsg, int wParam, int lParam);" -Name "Win32PostMessage" -Namespace Win32Functions -PassThru)::PostMessage(0xffff, 0x0112, 0xF170, 2)
Этот метод отключит экран, не блокируя окно PowerShell, что позволяет вам продолжать использование консоли.
Метод 3: Использование модуля DisplayConfig
Для более продвинутых пользователей вы можете установить модуль DisplayConfig
, который предоставляет комплексные команды для управления дисплеями. Для установки выполните:
Install-Module DisplayConfig
Получение информации о дисплеях
После установки модуля получите информацию о ваших дисплеях:
Get-DisplayInfo
Отключение экрана
Чтобы отключить определенный экран, воспользуйтесь командой:
Disable-Display [ID]
Где [ID]
— это идентификатор дисплея, который вы получили в предыдущем шаге.
Включение экрана
Чтобы снова включить экран, используйте:
Enable-Display [ID]
Заключение
Выбор правильного метода отключения экрана зависит от ваших потребностей. Если вы хотите быстро отключить экран и не планируете продолжать взаимодействие с PowerShell, воспользуйтесь первым методом с SendMessage
. Если вам нужно оставаться в интерактивном режиме, используйте PostMessage
. Для более комплексного управления экранами подойдет модуль DisplayConfig
.
Надеюсь, эти методы помогут вам легко управлять вашим экраном с помощью PowerShell.