Windows 8 托盘通知错误

标签 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 的文档中找到任何样式选项。这是恼人的错误还是我可以修复它?

问候。

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/

相关文章:

c - C程序中的函数调用函数

windows - Eclipse CDT -- 找不到程序 "make"(已安装 win7、mingw、msys)

powershell - 复制项目默认覆盖

powershell - 将当前用户添加到管理员组

android - 我们可以通过地区通知 ANE 加快通知设置速度吗?

c++ - wcout 没有按要求输出

c# - CoreAudio OnVolumeNotification 事件订阅导致 explorer.exe 中 CPU 使用率高

arrays - 在 Powershell 中内联创建和拆分数组两次

android - 如何在 "Notifications"窗口中没有扩展消息的情况下在状态栏中进行通知? (只想要图标)

java - 无法清除通知并打开通知中的 fragment