1

Я пытаюсь использовать скрипт, приведенный в этом ответе. Установка размера и положения окна в PowerShell 5 и 6.

установить высоту и размер окон Windows 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

в идеале я хотел бы иметь скрипт:

  1. откройте 3 окна проводника.
  2. перейти к пути к файлу A, B, C
  3. изменить размер каждого окна в определенном месте на экране

Как я могу сделать это без установки какого-либо дополнительного программного обеспечения и просто использовать raw powershell здесь?

РЕДАКТИРОВАТЬ: После использования предложения Harrymc, я прошел половину проблемы ... Я могу переместить окно, но мне просто нужно выяснить, как получить дескриптор 3 дочерних процессов проводника ...

$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)

Изменить 2:

Я попытался получить окно обозревателя с помощью функции Start-Process, но я получаю сообщение об ошибке:

$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

он говорит, что вышел ... но окно обозревателя файлов остается открытым ... не уверен, что здесь происходит. Если я попробую это с помощью блокнота, это сработает ...

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

Редактировать 3: я понял это с помощью ComObject и доступа к элементу (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")                                                   

2 ответа2

0

PowerShell на самом деле не является инструментом автоматизации пользовательского интерфейса. Согласно тому, что вы указали, почему бы просто не использовать ...

UIAutomation

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

Описание Проекта

Модуль UIAutomation упрощает автоматизацию тестирования программного обеспечения, когда вы работаете над тестами GUI. Основанный на библиотеке автоматизации пользовательского интерфейса, которая является частью .Net Framework начиная с версии 3.0, этот модуль призван максимально упростить жизнь программистам.

WASP

WASP - это оснастка PowerShell для задач автоматизации Windows, таких как выбор окон и элементов управления, а также отправка событий мыши и клавиатуры. У нас есть такие командлеты, как Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window

Примечание. Они больше не поддерживаются, но они по-прежнему работают так, как задумано, и тот факт, что вы используете пример кода, который никогда не был или никогда не будет поддерживаться.

Смотрите также это полностью поддерживаемое решение:

AutoIT

Новейшие версии языка сценариев AutoIt теперь получают бонус для пользователей PowerShell. Набор родных командлетов PowerShell! Это позволяет вам добавлять уникальные функции AutoIt - манипулирование окнами и симуляцию нажатия клавиш - к вашим обычным сценариям PowerShell. В качестве дополнительного бонуса, командлеты и сборки AutoIt PowerShell имеют цифровую подпись, что позволяет использовать их с более строгими политиками выполнения. Командлеты также будут работать с версиями PowerShell для x86 и x64!

0

Это должно быть возможно с помощью встроенного API Windows. Что-то вроде этого:

[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)

Поскольку этот общий код не работает для Explorer, вот альтернативное решение (проверено):

$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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .