teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

303閲覧

powershellで作成したウィンドウがうまく動かない

fumi4125

総合スコア1

PowerShell

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2025/06/14 14:42

編集2025/06/15 06:18

0

0

実現したいこと

Powershellでバッチを1秒おきに実行し、戻り値を受け取ってウィンドウ(フォーム)に描画したい

発生している問題・分からないこと

バッチ実行→処理→描画はうまくいっているが、なぜかウィンドウにどの操作(ウィンドウを閉じる、動かす、最小化)をしても受け付けない

該当のソースコード

powershell(main.ps1)

1# アセンブリのロード 2Add-Type -AssemblyName System.Windows.Forms 3Add-Type -AssemblyName System.Drawing 4 5# ウィンドウの作成・表示 6$screen = New-Object System.Windows.Forms.Form 7$screen.Width = 640 8$screen.Height = 480 9$screen.Text = "New Window" 10$screen.Show() 11$screen.Activate() 12$hellolabel = New-Object System.Windows.Forms.Label 13$hellolabel.Text = "" 14$hellolabel.Location = New-Object System.Drawing.Point(0, 0) 15$hellolabel.Font = New-Object System.Drawing.Font("MS ゴシック", 20) 16$hellolabel.Size = New-Object System.Drawing.Point(500, 32) 17$hellolabel.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter 18$screen.Controls.Add($hellolabel) 19 20while(1){ 21 #batで処理をして、戻り値を取得 22 cmd.exe /c ".\main.bat" 23 if ($LASTEXITCODE -eq 1){ 24 $hellolabel.Text = "-" 25 }else{ 26 $hellolabel.Text = "インターネット接続中" 27 } 28 $screen.Controls.Add($hellolabel) 29 Write-Host $LASTEXITCODE 30 # ラベルの作成・表示 31 Start-Sleep -m 1000 # 1秒間の停止 32} 33 34#フォームが閉じられた(FormClosed)ときに、Runから抜ける 35Write-Host "イベントループから脱出しました" 36exit 37 38

bat

1@echo off 2set server_ip=8.8.8.8 3ping -n 1 -w 1000 %server_ip% >nul 4exit %errorlevel%

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ウィンドウが応答するように直すには
[System.Windows.Forms.Application]::Run($screen)
をソースコードに入れるとうまくいくことが分かったが、これを実行するとほかの処理が停まってしまう

補足

windows10
powershell PSVersion 5.1.19041.5607

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因

どの操作(ウィンドウを閉じる、動かす、最小化)をしても受け付けない

フリーズしている原因は while(1) ループにあります。
Windows GUIアプリケーションは「メッセージループ」という仕組みで動作しており、UIスレッドがメッセージキューからメッセージ(クリック、描画要求、ウィンドウ移動など)を取得して処理することで、GUI操作が実現されています。
while(1) + Start-Sleep により、UIスレッドが1秒間ブロックされることで、メッセージループが停止し、ユーザーの操作を受け付けなくなります。

解決方法:タイマーを使用

whileループの代わりにタイマーを使用することで、UIスレッドをブロックせずに定期的な処理を実現できます。

PowerShell

1# アセンブリのロード 2Add-Type -AssemblyName System.Windows.Forms 3Add-Type -AssemblyName System.Drawing 4 5# ウィンドウの作成・表示 6$screen = New-Object System.Windows.Forms.Form 7$screen.Width = 640 8$screen.Height = 480 9$screen.Text = "New Window" 10 11# ラベルの作成 12$hellolabel = New-Object System.Windows.Forms.Label 13$hellolabel.Text = "" 14$hellolabel.Location = New-Object System.Drawing.Point(0, 0) 15$hellolabel.Font = New-Object System.Drawing.Font("MS ゴシック", 20) 16$hellolabel.Size = New-Object System.Drawing.Point(500, 32) 17$hellolabel.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter 18$screen.Controls.Add($hellolabel) 19 20# Timerを作成(1秒間隔で実行) 21$timer = New-Object System.Windows.Forms.Timer 22$timer.Interval = 1000 # 1秒 = 1000ミリ秒 23$timer.Add_Tick({ 24 # ping処理をここで実行 25 cmd.exe /c ".\main.bat" 26 if ($LASTEXITCODE -eq 1){ 27 $hellolabel.Text = "-" 28 }else{ 29 $hellolabel.Text = "インターネット接続中" 30 } 31 Write-Host $LASTEXITCODE 32}) 33 34# Timerを開始 35$timer.Start() 36 37# 適切なイベントループを開始(UIスレッドを解放) 38[System.Windows.Forms.Application]::Run($screen) 39 40# ウィンドウが閉じられたときの処理 41Write-Host "イベントループから脱出しました"

メッセージループのイメージ

※ 図は Claude Sonnet 先生に描いてもらいました。PowerShell ではなくC言語による疑似コードです。

イメージ説明

投稿2025/06/15 15:10

cx20

総合スコア4700

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

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

fumi4125

2025/06/17 11:33

返信が遅くなってしまいすみません。回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問