系统托盘弹出窗口 7 样式

Posted

技术标签:

【中文标题】系统托盘弹出窗口 7 样式【英文标题】:System Tray Popup Windows 7 Style 【发布时间】:2011-02-26 10:12:30 【问题描述】:

我想要这样的东西:

(来源:cybernetnews.com)

此窗口不可调整大小,并在与其相关的系统托盘图标上方对齐。

我有这个:

它是可调整大小的,它可以随心所欲。如果您在 Win 7 中单击音量控制,它总是会直接在图标上方弹出。这是理想的。

我找到了this reference,我认为它正在尝试解决同样的问题(虽然图像已经死了,但无法判断),

但我使用的是 WPF,但我不确定如何从我的 Window 对象中获取它们引用的这些 Form 对象。这是我目前窗口的 XAML 声明:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="WirelessControl.Window1"
x:Name="Window"
Title="Window1"
Width="260" Height="370" mc:Ignorable="d" WindowStyle="None"></Window>

根据这在 Windows 中的普遍性,我觉得必须有一种相当简单的方法来做到这一点。

ResizeMode="NoResize" 导致我的窗口边框消失,所以这无济于事。

谢谢大家,我希望我足够全面。

【问题讨论】:

【参考方案1】:

我在post 中回答了一个和你一样的问题

唯一的问题是调整大小的光标仍然可见。我认为您可以通过操纵窗口的消息循环来隐藏它们。

【讨论】:

【参考方案2】:

您可以使用Shell_NotifyIconGetRect 检索通知图标的位置。然后,您可以重新定位窗口以匹配该位置。这就是音量控制 UI 的作用。不幸的是,它只适用于 Win7。

如果您需要在较旧的操作系统上工作,您可以在 NIN_BALLOONSHOW 消息时获取鼠标光标位置 - 这就是音量控制 UI 过去所做的。

【讨论】:

我也可以在单击图标时获得鼠标光标,并且可以使用每 24 像素的模数来近似图标所在的级别。然而,这似乎是一种重新实现在 Windows Vista 和 7 中如此常见的对话框的解决方法。 这正是在 Windows 7 中添加 Shell_NotifyIconGetRect API 的原因 - 因为这是一项常见任务,他们将其自动化。【参考方案3】:

我在这里写了一系列关于这样做的帖子(并制作了一个示例项目):http://blog.quppa.net/2011/01/03/windows-7-style-notification-area-applications-in-wpf-recap-sample/

涵盖的主题包括在不移除玻璃边框的情况下移除窗口调整大小、查找通知图标的位置(在 Windows 7 中使用 Shell_NotifyIconGetRect 以及在早期版本中使用更老套的方法)、查找任务栏停靠对齐并找到正确的工作存在多个屏幕(监视器)时的区域。虽然我并没有真正写过它,但示例代码包括未启用 DWM(读取:Aero)的系统的回退(即,以 Windows 7 通知区域应用程序的样式绘制自定义 1 像素边框)。

【讨论】:

以上是关于系统托盘弹出窗口 7 样式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python创建系统托盘弹出消息? (视窗)

PyQt5:如何从系统托盘图标上下文菜单启动窗口?

请问怎样使程序在最小化后图标放在任务栏的托盘上?

centos7.9下Qt 实现系统托盘,托盘菜单,托盘消息

最小化到系统托盘区是啥意思?

java swing 系统托盘