🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PowerShell

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

Q&A

解決済

1回答

1619閲覧

powershell でのバルーン通知で処理が中断する

takumi3

総合スコア18

PowerShell

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

0グッド

0クリップ

投稿2019/09/08 07:40

編集2019/09/08 14:11

powershell でバルーン通知を行うとそのバルーン通知を消すか、時間制限で自動的に消えるまで、プログラムの処理が一時中断されてしまいます。バルーン通知を表示しつつもプログラムを実行し続ける手段は何かありますか?
バルーン通知を行う関数は以下の通りです。

Function Balloon ($Msg,$IconType) { #System.Windows.FormsクラスをPowerShellセッションに追加 Add-Type -AssemblyName System.Windows.Forms #NotifyIconクラスをインスタンス化 $balloon = New-Object System.Windows.Forms.NotifyIcon #powershellのアイコンを抜き出す $balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe') #特定のTipIconのみを使用可 #[System.Windows.Forms.ToolTipIcon] | Get-Member -Static -Type Property $balloon.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::$IconType #表示するメッセージ $balloon.BalloonTipText = $Msg #表示するタイトル $balloon.BalloonTipTitle = 'TimeManeger' #タスクトレイアイコン表示 $balloon.Visible = $True #5000ミリ秒表示 $balloon.ShowBalloonTip(5000) #1秒待ってからタスクトレイアイコン非表示 Start-Sleep -Seconds 10 $balloon.Visible = $False }

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

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

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

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

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

imihito

2019/09/08 11:40

具体的なコードを質問に追記してください。 「バルーン通知」が何を示しているのか不明ですし、私が想像したバルーン通知を出す方法は複数あるため、何が問題かもわからないです。
guest

回答1

0

ベストアンサー

プログラムの処理が一時中断されてしまいます。

に関しては以下の箇所で10秒待機しているので、「されてしまいます」というのはちょっとニュアンスが違うように思います。

powershell

1 #1秒待ってからタスクトレイアイコン非表示 2 Start-Sleep -Seconds 10

質問の意図を「バルーン通知の終了を待たずに次の処理に進みたい、ただし、バルーン通知自体の後片付けはしたい」とした場合、
NotifyIconのイベントを使うのが良いでしょう。

PowerShellでイベントを扱う方法はいくつかありますが、今回はRegister-ObjectEventコマンドレットが適していると思います。

以下のように対象オブジェクトとイベント名、イベント処理を指定することで、特定イベント発生時に処理を行えます。

powershell

1 # バルーンチップが閉じられたときの処理を予約 2 Register-ObjectEvent -InputObject $balloon -EventName BalloonTipClosed -Action { 3 [Windows.Forms.NotifyIcon]$notify = [Windows.Forms.NotifyIcon]$Sender 4 $notify.Visible = $False 5 $notify.Dispose() 6 } > $null

このあたりを踏まえるとBalloon関数は以下のような感じになるでしょう。

powershell

1#System.Windows.FormsクラスをPowerShellセッションに追加 2Add-Type -AssemblyName System.Windows.Forms 3 4Function Show-Balloon2 { 5 param( 6 [Parameter(Mandatory=$True)] 7 [string]$Msg 8 , 9 <# 元の処理でも以下のようにValidateSet属性を付けるとPowerShell3以降なら入力補完が効く 10 [ValidateSet('Error', 'Info', 'None', 'Warning')] 11 [string]$IconType 12 #> 13 [Windows.Forms.ToolTipIcon]$IconType = [Windows.Forms.ToolTipIcon]::None 14 ) 15 16 #System.Windows.FormsクラスをPowerShellセッションに追加 17 Add-Type -AssemblyName System.Windows.Forms 18 #NotifyIconクラスをインスタンス化 19 [Windows.Forms.NotifyIcon]$balloon = New-Object System.Windows.Forms.NotifyIcon 20 21 #powershellのアイコンを抜き出す 22 $balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe') 23 #特定のTipIconのみを使用可 24 #[System.Windows.Forms.ToolTipIcon] | Get-Member -Static -Type Property 25 $balloon.BalloonTipIcon = $IconType 26 #表示するメッセージ 27 $balloon.BalloonTipText = $Msg 28 #表示するタイトル 29 $balloon.BalloonTipTitle = 'TimeManeger' 30 #タスクトレイアイコン表示 31 $balloon.Visible = $True 32 33 # バルーンチップが閉じられたときの処理を予約 34 Register-ObjectEvent -InputObject $balloon -EventName BalloonTipClosed -Action { 35 [Windows.Forms.NotifyIcon]$notify = [Windows.Forms.NotifyIcon]$Sender 36 $notify.Visible = $False 37 $notify.Dispose() 38 } > $null 39 40 #5000ミリ秒表示 41 $balloon.ShowBalloonTip(5000) 42 43}

投稿2019/09/09 23:12

imihito

総合スコア2166

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問