Impostazione della dimensione di Explorer in Windows utilizzando lo script Set-Window personalizzato in Powershell


1

Sto cercando di utilizzare lo script fornito in questa risposta Impostazione della dimensione e della posizione della finestra in PowerShell 5 e 6

per impostare l'altezza e le dimensioni di più finestre di Windows Explorer. Non l'esploratore di Internet ... il browser di file chiamato "explorer".

funziona con il programma 'notepad'. ma non con il programma "explorer".

#works
Set-Window -ProcessName notepad-X 400 -Y 400 -Width 400 -Height 700 

#doesnt work
Set-Window -ProcessName explorer -X 400 -Y 400 -Width 400 -Height 700

idealmente mi piacerebbe avere una sceneggiatura:

  1. apri 3 finestre di esplorazione.
  2. passare al percorso file A, B, C
  3. ridimensiona ogni finestra in una posizione specifica sullo schermo

Come posso farlo senza installare alcun software aggiuntivo e usare solo raw PowerShell qui?

EDIT: Dopo aver usato il suggerimento di harrymc, sono riuscito a metà del problema .. Posso spostare la finestra ma devo solo capire come ottenere la gestione dei processi figlio di 3 explorer ...

$MethodDefinition = @'
[DllImport("user32.dll")]
public extern static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
'@

$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -Namespace 'Win32' -PassThru

# How do I get 3 child explorer IDs here?
# i can't pass in 'explorer' name because that references the parent process running the whole GUI
$Handle = (Get-Process -Name "notepad").MainWindowHandle

$Return = [Window]::MoveWindow($Handle, 10, 20, 400, 400,$True)

Modifica 2:

Ho provato a ottenere la finestra di Explorer tramite la funzione Start-Process ma sto ricevendo un errore:

$er3 = (Start-Process explorer -passthru)

PS C:\> (Get-Process -Id $er3.Id).MainWindowHandle
Get-Process : Cannot find a process with the process identifier 10572.At line:1 char:2
+ (Get-Process -Id $er3.Id).MainWindowHandle
+  ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (10572:Int32) [Get-Process], ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenId,Microsoft.PowerShell.Commands.GetProcessCommand

dice che è uscito ... ma la finestra di Esplora file rimane aperta ... non sono sicuro di cosa stia succedendo qui. Se lo provo con il blocco note funziona ...

$er4 = (Start-Process notepad -passthru)
PS C:\> (Get-Process -Id $er4.Id).MainWindowHandle
9899994

Modifica 3: l'ho capito usando ComObject e accedendo all'elemento (0).

$ex4 = New-Object -ComObject Shell.Application
$ex4.open("C:\")
# $ex4.windows()[0].Width = 400       # breaks
$ex5 = $ex4.Windows()[0]
$ex6 = $ex5.Item(0)              # not sure why i need to do this extra step
$ex6.Width = 400 
$ex6.Navigate("file:///C:/Folder1/Folder2")                                                   

Risposte:


0

Dovrebbe essere possibile utilizzando l'API Windows nativa. Qualcosa come questo:

[DllImport("User32.dll")]
public extern static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
...
$Handle = (Get-Process -Id $ProcessId).MainWindowHandle
$Return = [Window]::MoveWindow($Handle, $x, $y, $Width, $Height,$True)

Poiché questo codice generale non funziona per Explorer, ecco una soluzione alternativa (testata):

$ex1 = New-Object -ComObject Shell.Application
$ex1.open("C:\")
$ex1.windows()[0].Top = 10
# also assignable : Left, Width, Height
# if required : $handle = $ex1.windows()[0].HWND

Come posso ottenere il processId per un processo di esplorazione figlio? Il modo in cui lo capisco, se apro ctrl + alt + del task manager, vedo un processo di explorer in esecuzione (che è il processo che mostra praticamente l'intera GUI su Windows giusto?) Voglio solo selezionare uno dei piccoli finestre di Explorer situate sulla mia barra delle applicazioni.
Ryu S.

ok ho scoperto come ottenere l'ID di un processo explorer ma ottenerne l'handle è un errore causign ... ho aggiornato la domanda con un output di esempio
Ryu S.

Explorer sembra essere l'eccezione qui, quindi ho aggiunto un'alternativa che funziona.
harrymc,

hmm Ottengo un errore quando provo a impostare top, width etc ... vedi domanda aggiornata
Ryu S.

L'ho capito, ho dovuto aggiungere un passaggio aggiuntivo in cui ho avuto accesso all'oggetto usando gli oggetti (0)
Ryu S.

0

PowerShell non è in realtà uno strumento di automazione dell'interfaccia utente. Come per quello che hai indicato, perché non usare solo ...

UIAutomation

$w = Get-UIAWindow -ProcessName notepad
$w.Move(100, 100)

descrizione del progetto

Il modulo UIAutomation semplifica l'automazione dei test software quando si lavora su test GUI. Basato sulla libreria di automazione dell'interfaccia utente che fa parte di .Net Framework dal 3.0, il modulo ha lo scopo di semplificare al massimo la vita degli ingegneri del software.

VESPA

WASP è uno snapin di PowerShell per le attività di automazione di Windows come la selezione di finestre e controlli e l'invio di eventi del mouse e della tastiera. Disponiamo di cmdlet come Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window

Nota: questi non vengono più mantenuti, ma funziona ancora come previsto e il fatto che si sta utilizzando un codice di esempio che non è mai stato o sarà mai mantenuto.

Vedi anche questa soluzione completamente mantenuta:

AutoIt

Le versioni più recenti del linguaggio di scripting AutoIt ora hanno un bonus per gli utenti di PowerShell. Un set di Cmdlet nativi di PowerShell! Ciò consente di aggiungere le funzionalità uniche di AutoIt - manipolazione della finestra e simulazione della pressione dei tasti - ai soliti script di PowerShell. Come bonus aggiuntivo, i cmdlet e gli assiemi AutoIt PowerShell sono firmati digitalmente in modo da poter essere utilizzati con le più severe politiche di esecuzione. I Cmdlet funzioneranno anche nativamente con le versioni x86 e x64 di PowerShell!


A causa dei requisiti operativi, il sistema che sto utilizzando è una semplice macchina vanilla senza la possibilità di installare software personalizzato da Internet
Ryu S.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.