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 是光盘上真正存在的自定义图标。

它可以正常工作,除了一件小事。我更喜欢在我的窗口顶部有任务栏,它似乎给气球带来了麻烦:它画任务栏下(屏幕:https ://dl.dropbox.com/u/1138313/systraybug.PNG )。我用 notifyIcon 在 C# 中制作了测试应用程序并得到了相同的结果。但是像 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

另一种策略是降级任务栏。使用此代码查找最顶层的窗口:

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 NiotifyIcon 库在 WPF 应用程序中显示托盘图标。

高温高压

于 2013-07-12T13:28:31.683 回答