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

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

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

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

Q&A

解決済

1回答

7587閲覧

OpenFileDialog使用後にメッセージを最前面に表示したい。

hamozo

総合スコア1

PowerShell

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

0グッド

0クリップ

投稿2020/06/07 11:30

前提・実現したいこと

powershellでファイル名を取得し、結果を表示するルーチンを作成しています。
OpenFileDialog を使用してファイルを取得していますが、取得後、メッセージボックスにその内容を表示し、確認を促しています。

発生している問題・エラーメッセージ

このメッセージボックスを最前面に表示し、OKボタンにフォーカスを当てたいのですが、できません。
(キーボードのEnterキーを押すだけで次に進みたいのです。)

該当のソースコード

powershell

1function MessageBox([string]$title,[string]$labelText){ 2 3# フォーム全体の設定 4 $form = New-Object System.Windows.Forms.Form 5 $form.Size = New-Object System.Drawing.Size(400,300) 6 $form.Text = $title 7 $form.font = New-Object System.Drawing.Font("メイリオ",8) 8 9# ラベルを表示 10 $label = New-Object System.Windows.Forms.Label 11 $label.Location = New-Object System.Drawing.Point(10,10) 12 $label.Size = New-Object System.Drawing.Size(380,160) 13 $label.Text = $labelText 14 $form.Controls.Add($label) 15 16# OKボタンの設定 17 $OKButton = New-Object System.Windows.Forms.Button 18 $OKButton.Location = New-Object System.Drawing.Point(150,170) 19 $OKButton.Size = New-Object System.Drawing.Size(75,40) 20 $OKButton.Text = "OK" 21 $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK 22 $form.AcceptButton = $OKButton 23 $form.Controls.Add($OKButton) 24 25# フォームを表示 26 $form.Add_Shown($OKButton.Select()) 27 $form.Topmost = $True 28 $form.ShowDialog() 29 return 30} 31 32function FileOpenDialog([string]$title,[string]$filter){ 33 $dialog = New-Object System.Windows.Forms.OpenFileDialog 34 $dialog.Title = $title 35 $dialog.Filter = $filter 36 if ($dialog.Showdialog() -eq "OK") { 37 return $dialog.FileName 38 }else{ 39 return $null 40 } 41} 42 43Add-Type -Assembly System.Windows.Forms 44$fileName = FileOpenDialog "test" 45$a = MessageBox "test" $fileName 46

試したこと

.NET Frameworkライブラリの[System.Windows.Forms.MessageBox]::Show()も試しましたが、ダメでした。

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

PSVersion 5.1.18362.752
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.752
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

.Add_Shown()の行を次のように変えるとうまくいきました。

powershell

1$form.Add_Shown({ $form.Activate(); $OKButton.Select(); })

PowerShellでコントロール(GUIコンポーネント)にイベントハンドラを追加するにはAdd_イベント名()メソッドを使用します。スクリプトブロックを引数に渡すことで、イベントの発火時にその内容を呼び出すことができます。(公式Wiki)

フォームをアクティブにするためのメソッド.Activate()公式ドキュメントによると呼び出しに必須条件があります。

このメソッドが効果を持つようにするには、フォームが表示されている必要があります。

Shownイベントが発火するのはフォームが表示されたあとのようなので、.Add_Shown()メソッドを使って.Activate()の呼び出しをフォームの表示後に遅らせることにより.Activate()の呼び出しの条件を満たすことができます。

投稿2020/06/07 14:59

編集2020/06/08 12:55
reosablo

総合スコア339

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

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

hamozo

2020/06/08 03:39

reosablo様ありがとうございました。 add_shownメソッドに $form.Activate();を追記することで解決しました。 $form.ShowDialog()の前に記載してみたのですが、こちらはダメでした。
reosablo

2020/06/08 12:58

元の回答が不勉強だったのでちゃんと調べて編集機能で解説を追加しました。 `.ShowDialog()`を呼び出す前はフォームが非表示なので`.Activate()`を呼び出しても効果が無いようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問