我正在尝试在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应用程序有同样的问题(对我来说很惭愧,第一次看不到)。所以这是系统错误,我想。答案 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