Đặt kích thước trình thám hiểm trong các cửa sổ bằng cách sử dụng Tập lệnh cửa sổ tùy chỉnh trong Powershell


1

Tôi đang cố gắng sử dụng tập lệnh được đưa ra trong câu trả lời này Đặt kích thước và vị trí cửa sổ trong PowerShell 5 và 6

để đặt chiều cao và kích thước của nhiều cửa sổ windows explorer. Không phải trình thám hiểm internet .. trình duyệt tệp có tên 'explorer'.

nó hoạt động với chương trình 'notepad'. nhưng không phải với chương trình 'thám hiểm'.

#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

lý tưởng nhất là tôi muốn có một kịch bản:

  1. mở 3 cửa sổ thám hiểm.
  2. điều hướng đến filepath A, B, C
  3. Thay đổi kích thước mỗi cửa sổ thành một vị trí cụ thể trên màn hình

Làm thế nào tôi có thể làm điều này mà không cần cài đặt bất kỳ phần mềm bổ sung nào và chỉ sử dụng quyền hạn thô tại đây?

EDIT: Sau khi sử dụng đề xuất của harrymc, tôi đã giải quyết được một nửa vấn đề .. Tôi có thể di chuyển cửa sổ nhưng tôi chỉ cần tìm ra cách xử lý 3 tiến trình thám hiểm con ...

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

Chỉnh sửa 2:

Tôi đã thử nhận cửa sổ explorer thông qua chức năng Start-Process nhưng tôi gặp lỗi:

$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

nó nói rằng nó đã thoát ... nhưng cửa sổ filebrowser explorer vẫn mở ... không chắc chuyện gì đang xảy ra ở đây. Nếu tôi thử bằng notepad thì nó hoạt động ...

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

Chỉnh sửa 3: Tôi đã tìm ra nó bằng cách sử dụng ComObject và truy cập mục (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")                                                   

Câu trả lời:


0

Có thể sử dụng API Windows gốc. Một cái gì đó như thế này:

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

Vì mã chung này không hoạt động cho Explorer, đây là một giải pháp thay thế (đã thử nghiệm):

$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

Làm thế nào để tôi có được processId cho một quá trình thám hiểm trẻ em? Theo cách hiểu của tôi, nếu tôi mở ctrl + alt + del task manager, tôi thấy một quá trình thám hiểm đang chạy (đó là quá trình hiển thị toàn bộ GUI trên windows phải không?) Tôi chỉ muốn chọn một trong số nhỏ cửa sổ thám hiểm nằm trên thanh tác vụ của tôi.
Ryu S.

ok Tôi đã tìm hiểu làm thế nào để lấy Id của một quá trình thám hiểm nhưng việc xử lý nó gây ra lỗi ... đã cập nhật câu hỏi với một đầu ra ví dụ
Ryu S.

Explorer dường như là ngoại lệ ở đây, vì vậy tôi đã thêm một giải pháp thay thế hoạt động.
harrymc

hmm Tôi gặp lỗi khi cố gắng đặt đỉnh, chiều rộng, v.v ... xem câu hỏi được cập nhật
Ryu S.

Tôi đã tìm ra nó, tôi đã phải thêm một bước bổ sung nơi tôi truy cập đối tượng bằng các vật phẩm (0)
Ryu S.

0

PowerShell thực sự không phải là một công cụ tự động hóa UI. Theo những gì bạn đã chỉ ra, tại sao không sử dụng ...

UiAutomation

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

mô tả dự án

Mô-đun UIAutomation đơn giản hóa tự động kiểm thử phần mềm khi bạn đang làm việc trên các kiểm tra GUI. Dựa trên thư viện UI Tự động hóa là một phần của .Net Framework kể từ 3.0, mô-đun này nhằm giúp cuộc sống của các kỹ sư phần mềm trở nên dễ dàng nhất có thể.

ONG VÒ VẺ

WASP là một snapin PowerShell cho các tác vụ Tự động hóa của Windows như chọn các cửa sổ và điều khiển và gửi các sự kiện chuột và bàn phím. Chúng tôi có các lệnh ghép ngắn như Cửa sổ chọn, Điều khiển chọn, Khóa gửi, Nhấp chuột gửi, Get-WindowPocation, Set-WindowPocation, Set-WindowActive, Remove-Window

Lưu ý: Chúng không còn được duy trì, nhưng nó vẫn hoạt động như thiết kế và thực tế là bạn đang sử dụng mã mẫu chưa bao giờ hoặc sẽ được duy trì.

Xem thêm giải pháp duy trì đầy đủ này:

Tự động

Các phiên bản mới nhất của ngôn ngữ kịch bản AutoIt hiện đi kèm với phần thưởng cho người dùng PowerShell. Một bộ Cmdlets PowerShell riêng! Điều này cho phép bạn thêm các tính năng độc đáo của AutoIt - thao tác cửa sổ và mô phỏng tổ hợp phím - vào các tập lệnh PowerShell thông thường của bạn. Là một phần thưởng bổ sung, các lệnh và hội đồng AutoIt PowerShell được ký điện tử để chúng có thể được sử dụng với các chính sách thực thi nghiêm ngặt hơn. Các Cmdlets cũng sẽ chạy tự nhiên với các phiên bản x86 và x64 của PowerShell!


Do các yêu cầu vận hành, hệ thống tôi đang sử dụng là một máy vani đơn giản không có khả năng cài đặt phần mềm tùy chỉnh từ internet
Ryu S.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.