9

Windows 8 で簡単な Powershell スクリプトを作成しようとしています。このスクリプトは、システム トレイの通知バルーンを介して通知します。コードは非常に単純です。

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon

$objNotifyIcon.Icon = "D:\1.ico"
$objNotifyIcon.BalloonTipIcon = "Info"
$objNotifyIcon.BalloonTipText = "I'm there"
$objNotifyIcon.BalloonTipTitle = "Hello!"

$objNotifyIcon.Visible = $True
$objNotifyIcon.ShowBalloonTip(10000)

1.ico はディスク上に実際に存在するカスタム アイコンです。

1つの小さなことを除いて、正常に機能します。ウィンドウの上にタスクバーを配置することを好みますが、バルーンに問題があるようです:タスクバーの下に表示されます (画面: https://dl.dropbox.com/u/1138313/systraybug.PNG )。C# で notifyIcon を使用してテスト アプリケーションを作成したところ、同じ結果が得られました。しかし、Dropbox や Skydrive などの別のアプリケーションにはそのような問題はなく、タスクバーを下部に配置した私のスクリプトも完璧に機能します。NotifyIcon のドキュメントにスタイル オプションが見つかりませんでした。それは迷惑なバグですか、それとも修正できますか?

よろしく。

UPS: どうやら Dropbox アプリにも同じ問題があるようです (残念ながら最初はわかりませんでした)。これはシステムのバグだと思います。

4

2 に答える 2

2

これは Windows の既知のバグです。タスクバーの動作をオーバーライドできる唯一の方法は、バルーンのハンドルを見つけて、SetWindowPos を使用して最上位にすることです。

BOOL WINAPI SetWindowPos(
  _In_      HWND hWnd,
  _In_opt_  HWND hWndInsertAfter,
  _In_      int X,
  _In_      int Y,
  _In_      int cx,
  _In_      int cy,
  _In_      UINT uFlags
);

MSDN: 「hWndInsertAfter パラメーターを HWND_TOPMOST に設定し、SWP_NOZORDER フラグが設定されていないことを確認するか、ウィンドウの位置を Z オーダーに設定して、既存の最上位ウィンドウよりも上になるようにすることで、ウィンドウを最上位ウィンドウにすることができます。最上位以外のウィンドウが最上位になり、そのウィンドウが所有するウィンドウも最上位になります。ただし、その所有者は変更されません。詳細については、 SetWindowPosを参照してください。

もう 1 つの方法は、タスク バーを降格することです。次のコードを使用して、一番上のウィンドウを見つけます。

HWND FindMyTopMostWindow()
{
    DWORD dwProcID = GetCurrentProcessId();
    HWND hWnd = GetTopWindow(GetDesktopWindow());
    while(hWnd)
    {
        DWORD dwWndProcID = 0;
        GetWindowThreadProcessId(hWnd, &dwWndProcID);
        if(dwWndProcID == dwProcID)
            return hWnd;            
        hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
    }
    return NULL;
 }

次に、ウィンドウを降格するか、ウィンドウの zorder を高く設定します。

于 2013-05-28T05:11:06.467 に答える
0

同じ問題があり、バルーンの形状がメッセージ本文のサイズに依存することを発見しました。つまり、メッセージ本文が最大 60 文字の場合は丸い形の吹き出しが表示され、それより長いメッセージの場合は新しい標準の正方形の吹き出しが使用されます。

システム トレイと対話するために PowerShell を使用していませんが、WPF アプリ内でトレイ アイコンを表示するための WPF NiotifyIcon ライブラリを使用しています。

HTH

于 2013-07-12T13:28:31.683 に答える