pusuke0418’s diary

異常にマルチタスクな社内SEのブログ

PowerShellで開始・終了ページ指定して印刷

やりたいことは、下記。

  • あるアプリケーションが、とある状態で立ち上がっている状態
  • それを、あるページから、あるページまで(xxページから始まってそこから何ページ)を印刷する
  • それを繰り返すので、ちょっと楽したい
  • 難しいこと勉強するのはきついので、UI操作自動化みたいのがいい

何かいい方法はないかと、調べていたら、下記のような情報が。
WindowsアプリのUI自動操作をUI Automation PowerShell Extensionで行う | d.sunnyone.org

あとは、おおよそ下記を参考にしながらできそうな気配。
UI Automation PowerShell Extensions - Documentation
はじめはpythonがいいなと思っていたけれども、pywinautoはなぜかすぐ落ちるしWindowsはやはりWindowsであろう、と。

下記スクリプトプロトタイプ、すでにUIAutomationは読み込まれている状態から。ここでの、UI要素名とか諸々の記載は適当だが、このあたりはリンクにもあるように、UIAutomationSpy.exeを使えば簡単に判明することがわかった。

#印刷するアプリケーションを指定
#ウインドウの名前"hogedoc - Desktop"から取得
$window = "hogedoc - Desktop"
$wnd = Get-UiaWindow -name $window

#開始ページと終了ページを指定する。1ページから10ページめまで
$startp = 1
$endp = 1 + 9

#Ctrl+pにて印刷ダイアログ呼び出し
#keydownは押しっぱなし(多分),keypressは押す,keyupは押したキーを離す???
$wnd.keyboard.keydown([windowsinput.native.virtualkeycode]::control);
$wnd.keyboard.keypress([windowsinput.native.virtualkeycode]::VK_P);
$wnd.keyboard.keyup([windowsinput.native.virtualkeycode]::control)

#"印刷プレビュー"ウインドウが立ち上がる
#このウインドウで印刷するページを入力することになっている
#印刷の開始ページを指定する
#単純にtypetextで文字を送り込むとデフォルトで入っていた文字列に追記されてしまったため、
#ctrl + aを送り込んでからページ数を入力する
$pre_start = Get-UiaWindow -name "hogedoc - 印刷プレビュー" |`
 Get-UiaSpinner -AutomationId 'Page' -Class 'DomainUpDown' -Name 'start:' | `
 Get-UiaEdit -AutomationId 'Text' -Class 'TextBox'
$pre_start.keyboard.keydown([windowsinput.native.virtualkeycode]::control);
$pre_start.keyboard.keypress([windowsinput.native.virtualkeycode]::VK_A);
$pre_start.keyboard.keyup([windowsinput.native.virtualkeycode]::control)
$pre_start.keyboard.typetext($startp)

#印刷の終了ページを指定する
$pre_end = Get-UiaWindow -name "hogedoc - 印刷プレビュー" |`
 Get-UiaSpinner -AutomationId 'Page' -Class 'DomainUpDown' -Name 'end:' | `
 Get-UiaEdit -AutomationId 'Text' -Class 'TextBox'
$pre_end.keyboard.keydown([windowsinput.native.virtualkeycode]::control);
$pre_end.keyboard.keypress([windowsinput.native.virtualkeycode]::VK_A);
$pre_end.keyboard.keyup([windowsinput.native.virtualkeycode]::control)
$pre_end.keyboard.typetext($endp)

#続行ボタンを押して画面を進めるイメージ
Get-UiaWindow -name "hogedoc - 印刷プレビュー" | `
 Get-UiaButton -Class "Button" -Name "Continue" | Invoke-UiaButtonClick

#そして印刷画面。OKボタンを押して印刷するイメージ
Get-UiaWindow -name "印刷" | ` 
 Get-UiaButton -Class "Button" -Name "OK" | Invoke-UiaButtonClick


一行ずつ対話的にやっていたところでは、Ctrlキーを送り込んだ時点でシステム全体がCtrl押しっぱなし状態になって、困ったから再起動した。これ注意。