我正在尝试在 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 应用程序也有同样的问题(真可惜,第一次没看到)。所以我猜这是系统错误。
最佳答案
这是 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 设置得更高。
关于Windows 8 托盘通知错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482210/