Движение мыши с помощью PowerShell не предотвращает режим ожидания
Прежде чем начать, вот мой самый первый маленький код, который я написал в PowerShell:)
[System.Windows.Forms.Cursor]::Position = `
New-Object System.Drawing.Point($pos.X, ($pos.Y - 1))
[System.Windows.Forms.Cursor]::Position = `
New-Object System.Drawing.Point($pos.X, $pos.Y)
Чего я хочу достичь?
Ну, я хочу переместить курсор мыши каждые 4 минуты, чтобы предотвратить появление скринсейвера (каждую секунду в приведенном выше коде для тестирования). Кодекс действительно перемещает мышь каждый раз, когда один пиксель вверх, а затем сразу вниз.
Дело в том, что заставка (или режим ожидания в окнах) по-прежнему появляется.
Теперь я изучаю PowerShell, и у меня мало опыта работы с архитектурой Windows.
Кто-нибудь видит мою ошибку?
Я был бы признателен за ответ!: D
Спасибо заранее.
Ответы
Ответ 1
Решение из блога " Предотвратить блокировку рабочего стола или заставку с помощью PowerShell" работает для меня. Вот соответствующий скрипт, который просто отправляет один период в оболочку:
param($minutes = 60)
$myshell = New-Object -com "Wscript.Shell"
for ($i = 0; $i -lt $minutes; $i++) {
Start-Sleep -Seconds 60
$myshell.sendkeys(".")
}
и альтернатива из комментариев, которая перемещает мышь на один пиксель:
$Pos = [System.Windows.Forms.Cursor]::Position
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point((($Pos.X) + 1) , $Pos.Y)
$Pos = [System.Windows.Forms.Cursor]::Position
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point((($Pos.X) - 1) , $Pos.Y)
Ответ 2
У меня была аналогичная ситуация, когда загрузка должна была оставаться активной за одну ночь и требовала нажатия клавиши, которая обновляла мое соединение.
Я также обнаружил, что движение мыши не работает. Однако, используя блокнот и функцию отправки, похоже, сделали трюк. Я посылаю пробел вместо "." потому что если есть всплывающее окно [да/нет], оно автоматически нажимает на ответ по умолчанию, используя пробел. Здесь используется код.
param($minutes = 120)
$myShell = New-Object -com "Wscript.Shell"
for ($i = 0; $i -lt $minutes; $i++) {
Start-Sleep -Seconds 30
$myShell.sendkeys(" ")
}
Эта функция будет работать в течение 120 минут (2 часа), но может быть изменена для желаемого времени, увеличивая или уменьшая секунды ввода или увеличивая или уменьшая назначенное значение параметра минут.
Просто запустите script в PowerShell ISE или powershell и откройте блокнот. Пробел будет вводиться с заданным интервалом в течение требуемого периода времени ($ минут).
Удачи!
Ответ 3
Существует также аналоговое решение. Там есть приложение для Android, которое называется "Timeout Blocker", которое вибрирует с заданным интервалом, и вы наводите на него мышь. https://play.google.com/store/apps/details?id=com.isomerprogramming.application.timeoutblocker&hl=en
Ответ 4
Попробуйте следующее:
(источник: http://just-another-blog.net/programming/powershell-and-the-net-framework/)
Add-Type -AssemblyName System.Windows.Forms
$position = [System.Windows.Forms.Cursor]::Position
$position.X++
[System.Windows.Forms.Cursor]::Position = $position
while(1) {
$position = [System.Windows.Forms.Cursor]::Position
$position.X++
[System.Windows.Forms.Cursor]::Position = $position
$time = Get-Date;
$shorterTimeString = $time.ToString("HH:mm:ss");
Write-Host $shorterTimeString "Mouse pointer has been moved 1 pixel to the right"
#Set your duration between each mouse move
Start-Sleep -Seconds 150
}
Ответ 5
<# Stay Awake by Frank Poth 2019-04-16 #>
(Get-Host).UI.RawUI.WindowTitle = "Stay Awake"
[System.Console]::BufferWidth = [System.Console]::WindowWidth = 40
[System.Console]::BufferHeight = [System.Console]::WindowHeight = 10
$shell = New-Object -ComObject WScript.Shell
$start_time = Get-Date -UFormat %s <# Get the date in MS #>
$current_time = $start_time
$elapsed_time = 0
Write-Host "I am awake!"
Start-Sleep -Seconds 5
$count = 0
while($true) {
$shell.sendkeys("{NUMLOCK}{NUMLOCK}") <# Fake some input! #>
if ($count -eq 8) {
$count = 0
Clear-Host
}
if ($count -eq 0) {
$current_time = Get-Date -UFormat %s
$elapsed_time = $current_time - $start_time
Write-Host "I've been awake for "([System.Math]::Round(($elapsed_time / 60), 2))" minutes!"
} else { Write-Host "Must stay awake..." }
$count ++
Start-Sleep -Seconds 2.5
}
Часть, которая имеет значение, - это $shell.sendkeys("{NUMLOCK}{NUMLOCK}")
регистрирует два нажатия клавиши numlock и вводит оболочку в заблуждение относительно ввода ввода. Я написал это сегодня после поиска различных сценариев, которые не работают для меня. Надеюсь, это поможет кому-то!
Ответ 6
Я добавил уведомление о том, что вы можете легко включить/отключить, просто установив для его переменной значение $ true или $ false. Также курсор мыши перемещается на 1 пиксель вправо, а затем на 1 пиксель влево, поэтому он остается в основном на том же месте даже после нескольких итераций.
# Lines needed for the notification
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
Add-Type -AssemblyName System.Windows.Forms
$isNotificationOn = $true
$secondsBetweenMouseMoves = 6
$Pos = [System.Windows.Forms.Cursor]::Position
$PosDelta = 1
$logFilename = "previousMouseMoverAction.txt"
$errorLogFilename = "mouseMoverLog.txt"
if (!(Test-Path "$PSScriptRoot\$logFilename")) {
New-Item -path $PSScriptRoot -name $logFilename -type "file" -value "right"
Write-Host "Warning: previousMouseMoverAction.txt missing, created a new one."
}
$previousPositionChangeAction = Get-Content -Path $PSScriptRoot\$logFilename
if ($previousPositionChangeAction -eq "left") {
$PosDelta = 1
Set-Content -Path $PSScriptRoot\$logFilename -Value 'right'
} else {
$PosDelta = -1
Set-Content -Path $PSScriptRoot\$logFilename -Value 'left'
}
for ($i = 0; $i -lt $secondsBetweenMouseMoves; $i++) {
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point((($Pos.X) + $PosDelta) , $Pos.Y)
if ($isNotificationOn) {
# Sending a notification to the user
$global:balloon = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balloon.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
$balloon.BalloonTipText = 'I have just moved your cheese...'
$balloon.BalloonTipTitle = "Attention, $Env:USERNAME"
$balloon.Visible = $true
$balloon.ShowBalloonTip(3000)
}
}
Ответ 7
Я тоже попробовал решение по перемещению мыши, но оно также не сработало. Это было мое решение, чтобы быстро переключать Scroll Lock каждые 4 минуты:
Clear-Host
Echo "Keep-alive with Scroll Lock..."
$WShell = New-Object -com "Wscript.Shell"
while ($true)
{
$WShell.sendkeys("{SCROLLLOCK}")
Start-Sleep -Milliseconds 100
$WShell.sendkeys("{SCROLLLOCK}")
Start-Sleep -Seconds 240
}
Я использовал Scroll Lock, потому что это одна из самых бесполезных клавиш на клавиатуре. Также может быть приятно видеть, что он кратковременно мигает. Это решение должно работать почти для всех, я думаю.
Смотрите также: