Windows 8托盘通知错误

时间:2012-11-20 21:11:22

标签: windows powershell notifications

我正在尝试在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的文档中找到任何样式选项。这是烦人的bug还是我可以解决它?

问候。

UPS:看来,Dropbox应用程序有同样的问题(对我来说很惭愧,第一次看不到)。所以这是系统错误,我想。

2 个答案:

答案 0 :(得分: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设置得更高。

答案 1 :(得分:0)

我遇到了同样的问题,发现气球的形状取决于邮件正文的大小。 也就是说,如果您的邮件正文最多有60个字符,则会显示圆形气球,对于较长的邮件,将使用新的和标准的方形气球。

我没有使用PowerShell与系统托盘进行交互,而是使用WPF NiotifyIcon库在WPF应用程序中显示托盘图标。

HTH