web-dev-qa-db-fra.com

Comment un fichier de commandes peut-il exécuter un programme et définir la position et la taille de la fenêtre?

J'ai un fichier de commandes qui configure l'environnement de bureau pour moi lorsque j'écris du code. Le fichier s'appelle: SetEnv.cmd et il ouvre 3 autres fenêtres:

  1. Une instance de Windows Explorer définie sur le répertoire de déploiement du serveur d'applications.
  2. Une deuxième instance de l'Explorateur Windows définie dans le répertoire dans lequel mon fichier de déploiement est écrit.
  3. Une fenêtre de console pour démarrer mon serveur d'applications.

Voici le contenu de SetEnv.cmd:

Explorer /n,c:\develop\jboss-4.2.3.GA\server\default\deploy
Explorer /n,c:\develop\Project\Mapping\deploy
cmd /c SetupEnvCmd.cmd

Et voici le contenu de SetupEnvCmd.cmd:

cd C:\develop\jboss-4.2.3.GA\bin
run

Chaque fois que je lance cela, je dois perdre du temps à réorganiser et redimensionner les fenêtres. Je ne veux pas que les fenêtres soient réduites au minimum, car j'interagis plusieurs fois avec chaque fenêtre lors de l'écriture et du test de code. Existe-t-il un moyen de contrôler la position et/ou la taille des fenêtres ouvertes à partir du script?

24
Sean Mickey

Essayez de lancer vos programmes à partir du script VBS (Windows Script Host) via le fichier de commandes. Si votre VBS ressemble à ceci:

'FILENAME: SetEnv.vbs
Set Shell = WScript.CreateObject("WScript.Shell")
Shell.Run "Explorer /n,c:\develop\jboss-4.2.3.GA\server\default\deploy", 4, False
Shell.Run "Explorer /n,c:\develop\Project\Mapping\deploy", 4, False

Le 4 signifie lancer la fenêtre dans sa taille/position la plus récente. False signifie qu'il n'attendra pas de revenir avant d'exécuter la prochaine ligne de votre script. Malheureusement, cela ne vous donne pas un contrôle total de la taille/du positionnement exact de votre fenêtre, mais vous devez vous souvenir de la dernière taille/positionnement.

Plus d'infos ici: http://www.devguru.com/Technologies/wsh/quickref/wshshell_Run.html

Donc, votre nouveau SetEnv.cmd pourrait être:

@echo off
REM note there's a difference between cscript and wscript
REM wscript is usually the default launcher
cscript SetEnv.vbs
cd C:\develop\jboss-4.2.3.GA\bin
run
4
Marc

Voici une alternative avec nircmd util from http://www.nirsoft.net/utils/nircmd.html
Exemples:

nircmd win move ititle "cmd.exe" 5 5 10 10
nircmd win définit la taille "cmd.exe" 30 30 100 200
nircmd cmdwait 1000 win définit la taille "cmd.exe" 30 30 1000 600

Voici le contenu de SetEnv.cmd:

 Explorer /n,c:\develop\jboss-4.2.3.GA\server\default\deploy
 nircmd wait 1000 win définit la taille "quelque chose" x, y, largeur, hauteur 
 Explorer /n,c:\develop\Project\Mapping\deploy
 nircmd wait 1000 win définit la taille "quelque chose" x, y, largeur, hauteur 

Où x, y emplacement en haut à gauche et largeur, hauteur sont la taille de la fenêtre "Quelque chose" est le titre de la fenêtre, généralement le nom du dossier, par exemple. "c:\develop\jboss-4.2.3.GA\server\default\deploy" Il faudra peut-être ajuster le "wait" pour donner l'heure de l'initialisation de la fenêtre de l'application. Donc, vous auriez plus de temps si vous avez des antivirus qui tardent. Ce n'est pas vraiment un problème avec Explorer.exe ou cmd.exe, mais quelque chose comme les applications Firefox ou Java peut varier de quelques secondes à plusieurs dizaines de secondes en fonction de la vitesse de réglage de votre matériel et de votre système d'exploitation. Vous pouvez également personnaliser la fenêtre cmd.exe ou l'application "Exécuter" en ajoutant des lignes à "SetupEnvCmd.cmd en supposant que" Exécuter "est une application Win32 asynchrone, sinon ajoutez la commande" Démarrer ".

17
Skip R

La méthode suivante peut être utile pour les nouveaux utilisateurs qui ne souhaitent pas télécharger d’outil tiers et qui disposent de PowerShell (PS) modernes.

Le scénario était basé sur post de Garry Galler. Tous les dossiers de la question, mais vous pouvez remplacer par le vôtre.

Créez le fichier SetPositionAndSizeForExplorerWindow.ps1 avec le script PS:

# PowerShell script for opening Explorer windows and changing its position and size

# add .NET type
Add-Type @"
  using System;
  using System.Runtime.InteropServices;
  public class Win32 {
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string ClassName, IntPtr  TitleApp);
  }
  public struct RECT
  {
    public int Left;        // x position of upper-left corner
    public int Top;         // y position of upper-left corner
    public int Right;       // x position of lower-right corner
    public int Bottom;      // y position of lower-right corner
  }
"@

# set variable for RECT object
$rcWindow = New-Object RECT

#----- REPLACE WITH YOUR PATHs from HERE---------

# open first folder in separate Explorer process
Explorer.exe "c:\develop\jboss-4.2.3.GA\server\default\deploy"

# magic sleep =) to wait starting Explorer on slow machines
sleep -Milliseconds 1500

$h1 = (Get-Process | where {$_.mainWindowTitle -match "deploy"}).MainWindowHandle

# check if there is a window with this Title, if NO - return
if ($h1 -eq [IntPtr]::Zero) {return "Cannot find window with this Title"}

# bind RECT object with our window
[void][Win32]::GetWindowRect($h1,[ref]$rcWindow)
# set new position and size for window 
[void][Win32]::MoveWindow($h1, 10, 10, 700, 345, $true)

# remember PID to exclude it for next window with the same name
$duplicate = (Get-Process | where {$_.mainWindowTitle -match "deploy"}).Id

# open second folder in separate Explorer process
Explorer.exe "c:\develop\Project\Mapping\deploy"
sleep -Milliseconds 1500
$h1 = (Get-Process | where {$_.mainWindowTitle -match "deploy" -and $_.Id -ne $duplicate}).MainWindowHandle
if ($h1 -eq [IntPtr]::Zero) {return "Cannot find window with this Title"}
[void][Win32]::GetWindowRect($h1,[ref]$rcWindow)
[void][Win32]::MoveWindow($h1, 400, 20, 700, 335, $true)

# open cmd window with title SetupEnvCmd.cmd
cmd /c "start C:\develop\jboss-4.2.3.GA\bin\SetupEnvCmd.cmd"
sleep -Milliseconds 1500
# cmd.exe process has no own title, that's why we get PID searching by CommandLine process property
$process = "cmd.exe"
$cmdPID = Get-CimInstance Win32_Process -Filter "name = '$process'" | where {$_.CommandLine -match "SetupEnvCmd"} | select ProcessId
$h1 = (Get-Process | where {$_.Id -eq $cmdPID.ProcessId}).MainWindowHandle
if ($h1 -eq [IntPtr]::Zero) {return "Cannot find window with this Title"}
[void][Win32]::GetWindowRect($h1,[ref]$rcWindow)
[void][Win32]::MoveWindow($h1, 200, 400, 800, 400, $true)

Déplacez-le vers C:\develop folder. Créez un fichier OpenDevelopEnv.bat pour exécuter ce script .ps1 (afin de ne pas vous plonger dans la politique de sécurité de PS):

Powershell -executionpolicy RemoteSigned -File "C:\develop\SetPositionAndSizeForExplorerWindow.ps1"

Exécuter OpenDevelopEnv.bat

Pour la configuration multi-affichages, vous pouvez utiliser des coordonnées négatives, par exemple: pour ouvrir la fenêtre sur l'affichage gauche (par rapport au principal), vous pouvez écrire:

[void][Win32]::MoveWindow($h1, -600, 400, 800, 400, $true)

Désavantages:

  • PowerShell doit être installé.
  • les fenêtres requises doivent être fermées;
  • les dossiers commencent dans des processus distincts;
  • utilisation du temps de sommeil pour un travail correct sur des machines lentes.

Testé sur: Windows 10 Pro 1803 x64/x86 avec PSVersion 5.1 (administrateur et utilisateurs habituels)

1
hotenov

Départ StartX . Je ne l'ai pas utilisé, mais il semble que vous puissiez l'utiliser pour lancer une application avec une position et une taille spécifiques.

StartX, un utilitaire très simple vous permettant d'appeler l'API CreateProcess à partir de la ligne de commande.

Certains de ses paramètres en ligne de commande:

StartX ["title"] [/Dpath] [/MIN] [/MAX] [/Px,y] [/Scx1,cy1]

x, y: Spécifie les décalages x et y, en pixels, du coin supérieur gauche d'une fenêtre si une nouvelle fenêtre est créée. Le décalage est situé dans le coin supérieur gauche de l'écran. 

cx1, cy2: Spécifie la largeur et la hauteur, en pixels, de la fenêtre si une nouvelle fenêtre est créée. 

0
DJSizzlePuff