Windows 8托盘通知错误

Boh*_*nov 9 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)
Run Code Online (Sandbox Code Playgroud)

1.ico是光盘上真正存在的自定义图标.

除了一件小事之外,它应该工作.我更喜欢在我的窗口上放置任务栏,它似乎会给气球带来麻烦:它被绘制任务栏下面(屏幕:https://dl.dropbox.com/u/1138313/systraybug.PNG).我使用notifyIcon在C#中进行了测试应用,结果相同.但是像Dropbox或Skydrive这样的其他应用程序没有这样的问题,我的底部任务栏的脚本也很完美.我没有在NotifyIcon的文档中找到任何样式选项.这是烦人的bug还是我可以解决它?

问候.

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

Tyl*_*den 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
);
Run Code Online (Sandbox Code Playgroud)

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;
 }
Run Code Online (Sandbox Code Playgroud)

然后降级窗口或将窗口的 zorder 设置得更高。