質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

1回答

4311閲覧

PowerShellでマルチモニタの各モニタを指定してアプリを実行したい

nfglory

総合スコア4

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2020/07/02 10:24

前提・実現したいこと

PowerShellでマルチモニタの各モニタを指定してモニタ毎にアプリを実行したいと考えています。
モニタ①には、アプリ①を実行、モニタ②には、アプリ②を実行といった動作を実現したいと思っています。
指定したモニタでアプリ実行する方法をご教授いただけないでしょうか。

試したこと

スクリーン情報を取得する方法はわかるのですが、
指定したモニタをアクティブにしてアプリを実行する方法がわかりません。

モニタ情報取得

PS> Add-Type -AssemblyName System.Windows.Forms PS> [System.Windows.Forms.Screen]::AllScreens

補足情報(FW/ツールのバージョンなど)

Windows10 PowerShell 5.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Windows API の ShellExecuteExW を使えば恐らく可能だと思います。
引数に指定する SHELLEXECUTEINFOW 構造体にモニターを指定するフィールドがあるので、そう判断しました。

ただし、PowerShell で Windows API を扱うには C# などでラップする必要があり、やや面倒です。
確実性は落ちますが、別案を以下に記載します。

どのような方法かというと、一度ソフトを起動し、起動したウィンドウを指定したスクリーンまで移動させます。
ウィンドウの移動方法として、UI Automationという技術を使用します。

実際のコードは以下になります。FilePath に指定してプログラム(メモ帳)が一つ目のスクリーンで最大化されます。

powershell

1# https://teratail.com/questions/274616 2 3Add-Type -AssemblyName @( 4 # スクリーン取得用。 5 'System.Windows.Forms' 6 7 # 画面操作用のライブラリ。 8 'UIAutomationClient' 9 'UIAutomationTypes' 10) 11 12# 起動したいソフトへのパス。 13[string]$FilePath = 'notepad.exe' 14 15# 表示したいスクリーンを指定。 16[System.Windows.Forms.Screen]$DisplayScreen = [System.Windows.Forms.Screen]::AllScreens[0] 17 18# $FilePath を起動して、Process オブジェクトを取得。 19[System.Diagnostics.Process]$proc = Start-Process -FilePath $FilePath -PassThru 20 21# ウィンドウが生成されるまで待機(ここはソフトによって修正が必要な可能性あり) 22while ($proc.MainWindowHandle -eq [System.IntPtr]::Zero) { 23 Start-Sleep -Milliseconds 1 24} 25Start-Sleep -Milliseconds 1 26 27if ($proc.WaitForInputIdle()) { 28 # UI Automation を使って、ウィンドウハンドルから対象の UI 要素を取得。 29 [System.Windows.Automation.AutomationElement]$uiaProcMain = 30 [System.Windows.Automation.AutomationElement]::FromHandle($proc.MainWindowHandle) 31 32 # TransformPattern(移動及びサイズ変更が可能な一面) を取得。 33 [System.Windows.Automation.TransformPattern]$trans = 34 $uiaProcMain.GetCurrentPattern([System.Windows.Automation.TransformPattern]::Pattern) 35 36 # ウィンドウを表示したいスクリーンまで移動(本当は単位系が違うので、DPIの設定やPowerShell実行ホストによって上手く行かない可能性あり) 37 $trans.Move( 38 [double]($DisplayScreen.WorkingArea.Left), 39 [double]($DisplayScreen.WorkingArea.Top) 40 ) 41 42 # WindowPattern(ウィンドウとしての操作が可能な一面) を取得。 43 [System.Windows.Automation.WindowPattern]$win = 44 $uiaProcMain.GetCurrentPattern([System.Windows.Automation.WindowPattern]::Pattern) 45 46 # 画面を最大化。 47 $win.SetWindowVisualState( 48 [System.Windows.Automation.WindowVisualState]::Maximized 49 ) 50}

投稿2020/07/04 04:42

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問