Я пытаюсь использовать скрипт, указанный в этом ответе. Установка размера и положения окна в PowerShell 5 и 6
для установки высоты и размера нескольких окон проводника Windows. Не Internet Explorer.. файловый браузер называется '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
В идеале я хотел бы иметь сценарий:
- откройте 3 окна проводника.
- перейти к файлу A,B,C
- изменить размер каждого окна в соответствии с определенным местом на экране
Как это сделать, не устанавливая дополнительное программное обеспечение, а просто используя чистый PowerShell?
EDIT: После использования предложения 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 и обращаясь к item(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")
решение1
Это должно быть возможно с использованием собственного 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
решение2
PowerShell на самом деле не является инструментом автоматизации пользовательского интерфейса. Согласно тому, на что вы указали, почему бы просто не использовать...
$w = Get-UIAWindow -ProcessName notepad
$w.Move(100, 100)
Описание Проекта
Модуль UIAutomation упрощает автоматизацию тестирования программного обеспечения при работе над тестами GUI. Основанный на библиотеке UI Automation, которая является частью .Net Framework с версии 3.0, модуль призван максимально облегчить жизнь инженеров-программистов.
WASP — это PowerShell snapin для задач автоматизации Windows, таких как выбор окон и элементов управления, а также отправка событий мыши и клавиатуры. У нас есть такие командлеты, как Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window
Примечание: они больше не поддерживаются, но по-прежнему работают так, как задумано, и тот факт, что вы используете пример кода, который никогда не поддерживался и не будет поддерживаться.
См. также это полностью поддерживаемое решение:
Новейшие версии языка сценариев AutoIt теперь поставляются с бонусом для пользователей PowerShell. Набором собственных командлетов PowerShell! Это позволяет вам добавлять уникальные возможности AutoIt — управление окнами и имитацию нажатия клавиш — в ваши обычные скрипты PowerShell. В качестве дополнительного бонуса командлеты и сборки AutoIt PowerShell имеют цифровую подпись, поэтому их можно использовать с более строгими политиками выполнения. Командлеты также будут работать в исходном режиме с версиями PowerShell x86 и x64!