33 votes

le déplacement de la souris dans powershell n'empêche pas le mode veille

Avant de commencer, voici mon tout premier petit code écrit en 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)

Qu'est-ce que je veux atteindre ?

Eh bien, je veux déplacer le curseur de la souris toutes les 4 minutes pour empêcher l'écran de veille d'apparaître (toutes les secondes dans le code ci-dessus pour les tests). Le code déplace effectivement la souris à chaque fois d'un pixel vers le haut puis vers le bas immédiatement. Le problème est que l'économiseur d'écran (ou le mode veille de Windows) apparaît toujours.

Maintenant, j'apprends PowerShell et j'ai peu d'expérience avec l'architecture Windows.

Quelqu'un voit-il mon erreur ? J'apprécierais beaucoup une réponse ! :D Merci d'avance.

45voto

JPBlanc Points 26156

La solution du blog Empêcher le verrouillage du bureau ou l'économiseur d'écran avec PowerShell fonctionne pour moi. Voici le script pertinent, qui envoie simplement un seul point au shell :

param($minutes = 60)

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

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

35voto

Andrew Points 959

I a essayé une solution de déplacement de la souris également, et cela n'a pas fonctionné non plus. C'était ma solution, pour basculer rapidement l'Arrêt Défilant toutes les 4 minutes :

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
}

J'ai utilisé l'anti-scroll parce que c'est l'une des touches les plus inutiles du clavier. Il serait également agréable de la voir clignoter brièvement de temps en temps. Cette solution devrait convenir à presque tout le monde, je pense.

Certaines personnes réussissent à utiliser $WShell.sendkeys("SCROLLLOCK") au lieu de $WShell.sendkeys("{SCROLLLOCK}").

Voir aussi :

8voto

Matt Points 51

Il existe également une solution analogique à ce problème. Il existe une application Android appelée "Timeout Blocker" qui vibre à un intervalle défini et sur laquelle vous placez votre souris. https://play.google.com/store/apps/details?id=com.isomerprogramming.application.timeoutblocker&hl=en

4voto

Frank Points 575
<# 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

}

La partie qui compte est $shell.sendkeys("{NUMLOCK}{NUMLOCK}") Cela enregistre deux pressions sur la touche numlock et fait croire au shell qu'une entrée a été saisie. J'ai écrit ceci aujourd'hui après avoir cherché dans divers scripts qui ne fonctionnaient pas pour moi. J'espère que cela aidera quelqu'un !

3voto

Timespace7 Points 399

J'ai créé un PS script pour vérifier le temps d'inactivité et secouer la souris pour empêcher l'écran de veille.

Il existe deux paramètres qui permettent de contrôler son fonctionnement.

$checkIntervalInSeconds l'intervalle en secondes pour vérifier si le temps d'inactivité dépasse la limite.

$preventIdleLimitInSeconds : la limite du temps d'inactivité en secondes. Si le temps d'inactivité dépasse la limite de temps d'inactivité, secouez la souris pour empêcher l'économiseur d'écran de fonctionner.

Nous y voilà. Sauvegarder le script en preventIdle.ps1 . Pour éviter l'économiseur d'écran de 4 minutes, j'ai défini $checkIntervalInSeconds = 30 y $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
}

Ensuite, ouvrez Windows PowerShell et exécutez

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X