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.

2voto

CrashBandiCoot Points 53

J'ai connu une situation similaire où un téléchargement devait rester actif pendant la nuit et nécessitait une pression sur une touche qui rafraîchissait ma connexion. J'ai également constaté que le déplacement de la souris ne fonctionne pas. Cependant, l'utilisation du bloc-notes et d'une fonction de touche d'envoi semble avoir fait l'affaire. J'envoie un espace au lieu d'un "." parce que s'il y a un popup [oui/non], il cliquera automatiquement sur la réponse par défaut en utilisant la barre d'espace. Voici le code utilisé.

param($minutes = 120)

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

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

Cette fonction fonctionnera pendant les 120 minutes désignées (2 heures), mais peut être modifiée pour la durée souhaitée en augmentant ou en diminuant les secondes de l'entrée, ou en augmentant ou en diminuant la valeur assignée du paramètre des minutes.

Il suffit de lancer le script dans powershell ISE, ou powershell, et d'ouvrir le bloc-notes. Un espace sera saisi à l'intervalle spécifié pendant la durée souhaitée ($minutes).

Bonne chance !

2voto

Jeremy F. Points 1644

Essayez ceci : (source : 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  
    }

0voto

Pitto Points 160

J'ai ajouté une notification que vous pouvez facilement activer/désactiver en fixant sa variable à $true ou $false. De plus, le curseur de la souris se déplace de 1 px à droite puis de 1 px à gauche, de sorte qu'il reste fondamentalement au même endroit même après plusieurs itérations.

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

0voto

Ancalagon Points 1
$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
}

0voto

user1252803 Points 1

Je lance simplement alt+tab après chaque seconde aléatoire entre 5 et 10 sec. Parce que les nouveaux outils suivent même le modèle de toute pression de touche.

Ajoutez-le à l'intérieur d'une boucle et vous avez terminé.

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

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

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