8

短いバージョン: Windows メッセージの結果として呼び出される PowerShell のイベントを適切に使用して、バルーン ツールヒントのアイコンを取り除くには助けが必要だと思います。

ロングバージョン

実行時間の長い PowerShell コマンド (ビルド) があり、完了時にシステム トレイ/通知領域のバルーン ツールチップを介して通知されるようにしたいと考えています。

おおまかに必要な処理を行う Write-BalloonTip スクリプト (以下) を作成できました。唯一の問題は、トレイ アイコンで時々発生するように、トレイ アイコンにマウスを合わせるまで消えないことです。NotifyIconを表すために同じグローバル変数を再利用することで、このスクリプトを再利用して、システム トレイ アイコンが 1 つだけ残るように維持できます (マウスをその上に置くまで)。これはまだハックのように感じます。BalloonTipClosedイベントで通知され、そこで破棄されるようにイベント ハンドラーを追加しようとしました。イベント ハンドラーで、残りのアイコンを削除するために提案された 3 つの手法をすべて試しましたが、役に立ちませんでした。

厄介な部分は、単純な.Disposeスクリプトの後続の呼び出しで機能するように見えることです。これにより、イベント スクリプト ブロックがまったく呼び出されていないと思います。

別の WinForms アプリでヒントが消えた後に BalloonTipClosed が呼び出されることを確認しました。

基本的なものが欠けていますか?どんな助けでも大歓迎です。ありがとう!

「Write-BalloonTip.ps1」のコードは次のとおりです。

param
(
    $text,
    $title = "",
    $icon = "Info",
    $timeout=15000
)

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null

if ($global:writeBalloonTipIcon)
{
    # This gets rid of the previous one
    $global:writeBalloonTipIcon.Dispose()
}

$global:writeBalloonTipIcon = new-object System.Windows.Forms.NotifyIcon 
$global:writeBalloonTipIcon.Icon = [System.Drawing.SystemIcons]::Information

# FIXME: This *should* cleanup the icon after it's done, but it doesn't seem to work
$global:writeBalloonTipIcon.add_BalloonTipClosed(
  {
    # this *should* work, but it's not. What am I missing?
    $global:writeBalloonTipIcon.Icon = $null; 
    $global:writeBalloonTipIcon.Visible = $false; 
    $global:writeBalloonTipIcon.Dispose();
  });

$global:writeBalloonTipIcon.Visible = $true;
$global:writeBalloonTipIcon.ShowBalloonTip($timeout, $title, $text, $icon);
4

2 に答える 2

2

このコードは STA スレッドで実行する必要があると思います。PowerShell (ここに示されている v2) は、デフォルトで MTA スレッドで実行されます。

PS U:\> [System.Threading.Thread]::CurrentThread


ManagedThreadId    : 5
ExecutionContext   : System.Threading.ExecutionContext
Priority           : Normal
IsAlive            : True
IsThreadPoolThread : False
IsBackground       : False
ThreadState        : Running
ApartmentState     : MTA
CurrentUICulture   : en-US
CurrentCulture     : en-US
Name               : Pipeline Execution Thread
于 2010-02-01T19:24:38.733 に答える
1

Register-ObjectEvent を使用して BalloonTipClosed イベントをサブスクライブすることをお勧めします。これは最近、別の SO 投稿で取り上げられました。見てみな。

于 2010-02-01T20:34:29.417 に答える