5

私は密接に関連する投稿をたくさん見てきましたので、私は一人ではないことを知っていますが、私が探している答えを私に与えてくれる人は誰もいません. これが尋ねられて答えられたのに、私がそれを見つけることができなかった場合は、お詫び申し上げます。

このスクリプトはカスタムの通知領域バルーンを作成します。これをクリックすると、新しい IE ウィンドウが開き、何らかの URL が表示されます。私が使用しているPowerShell ISE GUIからはうまく機能します。他の投稿で提案されているオプションを使用してコマンドラインから機能させることはできません。具体的には、IE ウィンドウを開くことができません。通知は問題ないように見えますが、IE ウィンドウが表示されません...?? 試してみました:

  • パワーシェル 。スクリプト.ps1
  • powershell -ファイル script.ps1
  • 指図
  • &

考え?

私のスクリプト:

#Load the required assemblies
[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)
#Remove any registered events related to notifications
Remove-Event BalloonClicked_event -ea SilentlyContinue
Unregister-Event -SourceIdentifier BalloonClicked_event -ea silentlycontinue
Remove-Event BalloonClosed_event -ea SilentlyContinue
Unregister-Event -SourceIdentifier BalloonClosed_event -ea silentlycontinue
Remove-Event Disposed -ea SilentlyContinue
Unregister-Event -SourceIdentifier Disposed -ea silentlycontinue

#Create the notification object
$notification = New-Object System.Windows.Forms.NotifyIcon 
#Define various parts of the notification
$notification.Icon = [System.Drawing.SystemIcons]::Information
$notification.BalloonTipTitle = “**Reminder**”
$notification.BalloonTipIcon = “Warning”
$title = “message to user”
$notification.BalloonTipText = $title

#Make balloon tip visible when called
$notification.Visible = $True

## Register a click event with action to take based on event
#Balloon message clicked
register-objectevent $notification BalloonTipClicked BalloonClicked_event -Action {
    Start-Process 'c:\Program Files\Internet Explorer\iexplore.exe' -ArgumentList 'http://someURL.com' -WindowStyle Maximized -Verb Open
    #Get rid of the icon after action is taken
    $notification.Dispose()
    } | Out-Null

#Balloon message closed
register-objectevent $notification BalloonTipClosed BalloonClosed_event -Action {$notification.Dispose()} | Out-Null

#Call the balloon notification
$notification.ShowBalloonTip(1000)
4

3 に答える 3

4

非対話型プロンプトで機能しない理由は、ユーザーがバルーンをクリックしたときに、powershell が既に処理を終了しているためです。

これは、次の 2 つの方法のいずれかで修正できます。

  • スクリプトの最後に sleep(1) を追加して、ユーザーがバルーンをクリックする前にスクリプトが終了しないようにします。(必要に応じて値を増やしますが、1秒で問題なくテストしました)
  • -noexit コマンドライン パラメーターを使用し、ユーザーが通知をクリックしたとき、または少し遅れて PowerShell をプログラムで閉じます (コードを変更せずに IE を起動することをテストし、exit 部分のコーディングを気にしませんでした。)
于 2011-06-14T20:59:25.953 に答える
2

実際の開発者の助けを借りて C# に変更しました。誰かがそれを持っていれば、本当のパワーシェルの答えをいただければ幸いです。

新しいコード:

$code = @'
using System;
using System.Drawing;
using System.Windows.Forms;

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        NotifyIcon nicon = new NotifyIcon();
        nicon.BalloonTipIcon = ToolTipIcon.Info;
        nicon.BalloonTipText = "message to user";
        nicon.BalloonTipTitle = "*** title for user ***";
        nicon.Icon = SystemIcons.Information;
        nicon.BalloonTipClicked += (sender, e) =>
        {
            System.Diagnostics.Process.Start("http://website.com");
            CleanUp(nicon);
        };
        nicon.BalloonTipClosed += (sender, e) => CleanUp(nicon);
        nicon.Visible = true;
        nicon.ShowBalloonTip(1000 * 1);
        Application.Run();
    }
    static void CleanUp(NotifyIcon c)
    {
        c.Visible = false;
        c.Dispose();
        Application.Exit();
    }
}

'@
Write-Host $code
Add-Type -OutputType WindowsApplication -OutputAssembly c:\temp\test.exe -TypeDefinition  $code -ReferencedAssemblies "System.Drawing","System.Windows.Forms" -Language CSharpVersion3
于 2011-03-22T14:59:26.217 に答える
0

解決策はPowerShell.exe、パラメーターを使用して開始 (つまり、コンソール ウィンドウ) することだと思い-staます。

Windows GUI コードは、COM の "シングル スレッド アパートメント" (STA) として設定されたスレッドで実行する必要がありますが、既定では、PowerShell コンソールのワーカー スレッドは "マルチ スレッド アパートメント" (MTA) で実行されます。

于 2011-03-22T15:43:23.590 に答える