programing

파워셸 마우스를 움직여도 유휴 모드가 방지되지 않습니다.

muds 2023. 9. 3. 16:41
반응형

파워셸 마우스를 움직여도 유휴 모드가 방지되지 않습니다.

[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을 사용한 데스크톱 잠금 또는 화면 보호기 방지 블로그의 솔루션이 효과적입니다.다음은 셸로 단일 기간을 보내는 관련 스크립트입니다.

param($minutes = 60)

$myshell = New-Object -com "Wscript.Shell"

for ($i = 0; $i -lt $minutes; $i++) {
  Start-Sleep -Seconds 60
  $myshell.sendkeys(".")
}

저도 마우스 무브 솔루션을 시도해봤지만 역시 작동하지 않았습니다.4분마다 스크롤 잠금을 빠르게 전환할 수 있는 솔루션이었습니다.

업데이트: 개선된 버전입니다.

#This script exists because the auto-lock/disconnect time period is way too short.

#*** Make sure to lock before you go AFK! ***

#==============================================================================

#https://stackoverflow.com/a/56636565/1599699
#https://gist.github.com/MatthewSteeples/ce7114b4d3488fc49b6a?permalink_comment_id=4590234#gistcomment-4590234
#https://ss64.com/vb/sendkeys.html
#https://devguru.com/content/technologies/wsh/wshshell-sendkeys.html

#==============================================================================

$host.UI.RawUI.WindowTitle = "OS Keep-Alive"
[Console]::SetWindowSize(50, 10)

$format = "dddd MM/dd/yy hh:mm:ss tt"
$start = $(Get-Date -Format $format)
$previous = "N/A"

$WShell = New-Object -com "Wscript.Shell"
while ($true)
{
  Clear-Host
  Echo "Keep-alive with Scroll Lock toggle..."
  Write-Host
  Write-Host "     Start:" $start
  Write-Host "  Previous:" $previous
  $previous = $(Get-Date -Format $format)
  Write-Host "    Latest:" $previous
  Write-Host
  Echo "*** Make sure to lock before you go AFK! ***"

  #==============================================================================
  
  #If you're getting a "null-valued" expression error, try "SCROLLLOCK" instead.
  $WShell.sendkeys("{SCROLLLOCK}")
  Start-Sleep -Milliseconds 100 #100 milliseconds == 1/10th seconds

  $WShell.sendkeys("{SCROLLLOCK}")
  Start-Sleep -Seconds 240 #240 seconds == 4 minutes * 60 seconds
}

키보드에서 가장 쓸모없는 키 중 하나이기 때문에 Scroll Lock을 사용했습니다.또한 가끔 잠깐 깜박이는 것을 보는 것도 좋을 수 있습니다.이 해결책은 거의 모든 사람들에게 효과가 있을 것이라고 생각합니다.

일부 사용자는 $WSHELL.sendkey("{SCROLLOCK}") 대신 $WSHELL.sendkey("SCROLLOCK")를 사용하여 성공을 거두기도 합니다.

참고 항목:

이에 대한 아날로그 솔루션도 있습니다.설정된 간격으로 진동하는 '타임아웃 블로커'라는 안드로이드 앱이 있는데 거기에 마우스를 올려놓습니다.https://play.google.com/store/apps/details?id=com.isomerprogramming.application.timeoutblocker&hl=en

<# 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}")이것은 누록 키를 두 번 누르면 셸이 입력된 것으로 착각하도록 합니다.저는 제게 맞지 않는 다양한 스크립트를 검색한 후 오늘 이 글을 썼습니다.누군가에게 도움이 되길 바랍니다!

저는 화면 보호기를 방지하기 위해 유휴 시간을 확인하고 마우스를 흔들기 위해 PS 스크립트를 만들었습니다.

작동 방식을 제어할 수 있는 두 가지 매개 변수가 있습니다.

$checkIntervalInSeconds(초)

$preventIdleLimitInSeconds유휴 시간 제한(초).제한을 를 지그재그로 화면 가 작동하지 합니다.

시작하자.스크립트 저장 위치preventIdle.ps1보호기를 4분 화면 보호기를 했습니다.$checkIntervalInSeconds = 30그리고.$preventIdleLimitInSeconds = 180.

Add-Type @'
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace PInvoke.Win32 {

    public static class UserInput {

        [DllImport("user32.dll", SetLastError=false)]
        private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

        [StructLayout(LayoutKind.Sequential)]
        private struct LASTINPUTINFO {
            public uint cbSize;
            public int dwTime;
        }

        public static DateTime LastInput {
            get {
                DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount);
                DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks);
                return lastInput;
            }
        }

        public static TimeSpan IdleTime {
            get {
                return DateTime.UtcNow.Subtract(LastInput);
            }
        }

        public static double IdleSeconds {
            get {
                return IdleTime.TotalSeconds;
            }
        }

        public static int LastInputTicks {
            get {
                LASTINPUTINFO lii = new LASTINPUTINFO();
                lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));
                GetLastInputInfo(ref lii);
                return lii.dwTime;
            }
        }
    }
}
'@

Add-Type @'
using System;
using System.Runtime.InteropServices;

namespace MouseMover
{
    public class MouseSimulator
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetCursorPos(out POINT lpPoint);

        [StructLayout(LayoutKind.Sequential)]
        struct INPUT
        {
            public SendInputEventType type;
            public MouseKeybdhardwareInputUnion mkhi;
        }
        [StructLayout(LayoutKind.Explicit)]
        struct MouseKeybdhardwareInputUnion
        {
            [FieldOffset(0)]
            public MouseInputData mi;

            [FieldOffset(0)]
            public KEYBDINPUT ki;

            [FieldOffset(0)]
            public HARDWAREINPUT hi;
        }
        [StructLayout(LayoutKind.Sequential)]
        struct KEYBDINPUT
        {
            public ushort wVk;
            public ushort wScan;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }
        [StructLayout(LayoutKind.Sequential)]
        struct HARDWAREINPUT
        {
            public int uMsg;
            public short wParamL;
            public short wParamH;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;

            public POINT(int x, int y)
            {
                this.X = x;
                this.Y = y;
            }
        }
        struct MouseInputData
        {
            public int dx;
            public int dy;
            public uint mouseData;
            public MouseEventFlags dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }

        [Flags]
        enum MouseEventFlags : uint
        {
            MOUSEEVENTF_MOVE = 0x0001
        }
        enum SendInputEventType : int
        {
            InputMouse
        }
        public static void MoveMouseBy(int x, int y) {
            INPUT mouseInput = new INPUT();
            mouseInput.type = SendInputEventType.InputMouse;
            mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE;
            mouseInput.mkhi.mi.dx = x;
            mouseInput.mkhi.mi.dy = y;
            SendInput(1, ref mouseInput, Marshal.SizeOf(mouseInput));
        }
    }
}
'@

$checkIntervalInSeconds = 30
$preventIdleLimitInSeconds = 180

while($True) {
    if (([PInvoke.Win32.UserInput]::IdleSeconds -ge $preventIdleLimitInSeconds)) {
        [MouseMover.MouseSimulator]::MoveMouseBy(10,0)
        [MouseMover.MouseSimulator]::MoveMouseBy(-10,0)
    }
    Start-Sleep -Seconds $checkIntervalInSeconds
}

그런 다음 Windows PowerShell을 열고 실행합니다.

powershell -ExecutionPolicy ByPass -File C:\SCRIPT-DIRECTORY-PATH\preventIdle.ps1

다운로드가 밤새 활성 상태를 유지해야 하는 유사한 상황이 발생하여 연결을 새로 고친 키를 눌러야 했습니다.저는 또한 마우스의 움직임이 작동하지 않는다는 것을 발견했습니다.하지만 메모장과 보내기 키 기능을 사용하면 효과가 있는 것 같습니다.[yes/no] 팝업이 있는 경우 스페이스바를 사용하여 기본 응답을 자동으로 클릭하기 때문에 "." 대신 공백을 보냅니다.여기 사용된 코드가 있습니다.

param($minutes = 120)

$myShell = New-Object -com "Wscript.Shell"

for ($i = 0; $i -lt $minutes; $i++) {
  Start-Sleep -Seconds 30
  $myShell.sendkeys(" ")
}

이 기능은 지정된 120분(2시간) 동안 작동하지만, 입력 초를 늘리거나 줄이거나 분 매개 변수의 할당된 값을 늘리거나 줄여 원하는 타이밍에 맞게 수정할 수 있습니다.

powershell ISE 또는 powershell에서 스크립트를 실행하고 메모장을 엽니다.원하는 시간($분) 동안 지정된 간격으로 공백이 입력됩니다.

행운을 빕니다.

사용해 보십시오. (출처: 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  
    }  

PowerShell 스크립트 아래에서는 스크립트를 무제한으로 실행하려는 경우 매 분마다 스크롤 잠금을 전환하고 현재 시간을 출력하며 5분마다 콘솔을 지웁니다.

$WShell = New-Object -com "Wscript.Shell"
cls

$count = 0
while ($true)
{
  $count = $count + 1
  if($count -eq 5) {
    cls
    $count=0
  }
  $WShell.sendkeys("{SCROLLLOCK}")
  Start-Sleep -Milliseconds 100
  Write-Output "Toggle Scroll at $(Get-Date -Format u)"
  $WShell.sendkeys("{SCROLLLOCK}")
  Start-Sleep -Seconds 60
}

변수를 $true 또는 $false로 설정하기만 하면 쉽게 활성화/비활성화할 수 있다는 알림을 추가했습니다.또한 마우스 커서는 오른쪽으로 1px 이동한 다음 왼쪽으로 1px 이동하므로 여러 번 반복해도 기본적으로 동일한 위치에 유지됩니다.

# 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)
    }
}

새 도구는 키 누르기 패턴까지 추적하기 때문에 5~10초 사이의 임의의 초마다 alt+tab을 실행합니다.

루프 안에 추가하면 완료됩니다.

[System.Windows.Forms.SendKeys]::SendWait("%{TAB}")

$ran=(Get-Random -Minimum 5 -Maximum 10)
echo "sleep for $ran sec"
sleep $ran 

언급URL : https://stackoverflow.com/questions/15835941/powershell-mouse-move-does-not-prevent-idle-mode

반응형