C# 显示气球通知
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13373060/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Show a Balloon notification
提问by Ben
I'm trying to use the below code to show a Balloon notification. I've verified that it's being executed by using breakpoints. It's also showing no errors.
我正在尝试使用以下代码来显示气球通知。我已经验证它是通过使用断点执行的。它也显示没有错误。
What should I do to debug this since it's not throwing errors and not showing the balloon?
我应该怎么做才能调试这个,因为它没有抛出错误也没有显示气球?
private void showBalloon(string title, string body)
{
NotifyIcon notifyIcon = new NotifyIcon();
notifyIcon.Visible = true;
if (title != null)
{
notifyIcon.BalloonTipTitle = title;
}
if (body != null)
{
notifyIcon.BalloonTipText = body;
}
notifyIcon.ShowBalloonTip(30000);
}
采纳答案by evanmcdonnal
You have not actually specified an icon to display in the task bar. Running your code in LINQPad, by simply adding notifyIcon.Icon = SystemIcons.Applicationbefore the call to ShowBalloonTipI was able to get the tip to be displayed. Also note that you should call Disposewhen you are done with your NotifyIconinstance.
您实际上并未指定要在任务栏中显示的图标。在 LINQPad 中运行您的代码,只需notifyIcon.Icon = SystemIcons.Application在调用ShowBalloonTipI之前添加即可显示提示。另请注意,您应该Dispose在完成NotifyIcon实例后调用。
回答by AaronLS
ShowBalloonnTip takes the number of milliseconds. 3 milliseconds might be too fast for you to even see. Try something more like 3000
ShowBalloonnTip 需要毫秒数。3 毫秒可能太快了,您甚至看不到。尝试更像 3000
You might need to pass a component model to the contructor. It's what I see in all the examples. Sorry been a long time since I've used it. See first answer here:
您可能需要将组件模型传递给构造函数。这就是我在所有示例中看到的。很抱歉我已经使用它很久了。请参阅此处的第一个答案:
回答by evanmcdonnal
Take a look at the example here http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx
看看这里的例子 http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx
I see some distinct differences between it an your code, there are many pieces you're leaving out such as creating a ComponentModelContainerand passing that into the NotifyIcon's constructor.
我看到它与您的代码之间存在一些明显差异,您遗漏了许多部分,例如创建 aComponentModelContainer并将其传递到NotifyIcon的构造函数中。
回答by kombsh
See the below source code.
请参阅下面的源代码。
using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
namespace ShowToolTip
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btBallonToolTip_Click(object sender, EventArgs e)
{
ShowBalloonTip();
this.Hide();
}
private void ShowBalloonTip()
{
Container bpcomponents = new Container();
ContextMenu contextMenu1 = new ContextMenu();
MenuItem runMenu = new MenuItem();
runMenu.Index = 1;
runMenu.Text = "Run...";
runMenu.Click += new EventHandler(runMenu_Click);
MenuItem breakMenu = new MenuItem();
breakMenu.Index = 2;
breakMenu.Text = "-------------";
MenuItem exitMenu = new MenuItem();
exitMenu.Index = 3;
exitMenu.Text = "E&xit";
exitMenu.Click += new EventHandler(exitMenu_Click);
// Initialize contextMenu1
contextMenu1.MenuItems.AddRange(
new System.Windows.Forms.MenuItem[] { runMenu, breakMenu, exitMenu });
// Initialize menuItem1
this.ClientSize = new System.Drawing.Size(0, 0);
this.Text = "Ballon Tootip Example";
// Create the NotifyIcon.
NotifyIcon notifyIcon = new NotifyIcon(bpcomponents);
// The Icon property sets the icon that will appear
// in the systray for this application.
string iconPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\setup-icon.ico";
notifyIcon.Icon = new Icon(iconPath);
// The ContextMenu property sets the menu that will
// appear when the systray icon is right clicked.
notifyIcon.ContextMenu = contextMenu1;
notifyIcon.Visible = true;
// The Text property sets the text that will be displayed,
// in a tooltip, when the mouse hovers over the systray icon.
notifyIcon.Text = "Morgan Tech Space BallonTip Running...";
notifyIcon.BalloonTipText = "Morgan Tech Space BallonTip Running...";
notifyIcon.BalloonTipTitle = "Morgan Tech Space";
notifyIcon.ShowBalloonTip(1000);
}
void exitMenu_Click(object sender, EventArgs e)
{
this.Close();
}
void runMenu_Click(object sender, EventArgs e)
{
MessageBox.Show("BallonTip is Running....");
}
}
}
回答by Jeremy Cook
Matthew identified the issue, but I still struggled to put all the pieces together. So I thought a concise example that works in LINQPad as-is would be helpful (and presumably elsewhere). Just reference the System.Windows.Formsassembly, and paste this code in.
马修确定了这个问题,但我仍然努力把所有的部分放在一起。所以我认为一个在 LINQPad 中按原样工作的简洁示例会有所帮助(大概在其他地方)。只需引用System.Windows.Forms程序集,然后粘贴此代码即可。
var notification = new System.Windows.Forms.NotifyIcon()
{
Visible = true,
Icon = System.Drawing.SystemIcons.Information,
// optional - BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info,
// optional - BalloonTipTitle = "My Title",
BalloonTipText = "My long description...",
};
// Display for 5 seconds.
notification.ShowBalloonTip(5000);
// This will let the balloon close after it's 5 second timeout
// for demonstration purposes. Comment this out to see what happens
// when dispose is called while a balloon is still visible.
Thread.Sleep(10000);
// The notification should be disposed when you don't need it anymore,
// but doing so will immediately close the balloon if it's visible.
notification.Dispose();
回答by Colm Bhandal
For the sake of future coders:
为了未来的编码员:
the [timeout] parameter is deprecated as of windows vista
[timeout] 参数自 windows vista 起已弃用
See: C# NotifyIcon Show Balloon Parameter Deprecated
So you might as well just put 0 into the parameter for > Windows Vista. What's worse, comments on the linked answer suggests that the replacement for these balloons, toast notifications, were only introduced in Windows 8. So for poor old Windows 7 falling between two stools, with Vista < 7 < 8, we seem to be at the mercy of however long Windows wants to keep that balloon there! It does eventually fade away, I've noticed, but after some empirical testing I'm quite sure that parameter is indeed being ignored.
因此,您不妨将 0 放入 > Windows Vista 的参数中。更糟糕的是,对链接答案的评论表明这些气球的替代品,吐司通知,仅在 Windows 8 中引入。因此,对于介于两个凳子之间的可怜的旧 Windows 7,Vista < 7 < 8,我们似乎处于不管 Windows 想把那个气球留在那里多久!我注意到它最终会消失,但经过一些经验测试后,我很确定该参数确实被忽略了。
So, building on the answers above, and in particular taking the lambda functions suggested by @jlmt in the comments, here's a solution that works for me on Windows 7:
因此,基于上面的答案,特别是采用@jlmt 在评论中建议的 lambda 函数,这里有一个适用于我在 Windows 7 上的解决方案:
//Todo: use abstract factory pattern to detect Windows 8 and in that case use a toastnotification instead
private void DisplayNotificationBalloon(string header, string message)
{
NotifyIcon notifyIcon = new NotifyIcon
{
Visible = true,
Icon = SystemIcons.Application
};
if (header != null)
{
notifyIcon.BalloonTipTitle = header;
}
if (message != null)
{
notifyIcon.BalloonTipText = message;
}
notifyIcon.BalloonTipClosed += (sender, args) => dispose(notifyIcon);
notifyIcon.BalloonTipClicked += (sender, args) => dispose(notifyIcon);
notifyIcon.ShowBalloonTip(0);
}
private void dispose(NotifyIcon notifyIcon)
{
notifyIcon.Dispose();
}
Notes
笔记
- I've put a TODO in there to write another implementation for Windows 8, as people are 50/50 now on Windows 7/8 so would be good to support a newer functionality. I guess anyone else coding this for multiple versions of windows should probably do the same, ideally. Or just stop supporting 7 and switch to using ToastNotification.
- I purposely defined the disposal in a function so I could debug and verify that the breakpoint was indeed being hit.
- 我在那里放了一个 TODO 来为 Windows 8 编写另一个实现,因为现在人们在 Windows 7/8 上有 50/50,所以支持更新的功能会很好。我想其他任何人都应该为多个版本的 Windows 编写代码,理想情况下也应该这样做。或者只是停止支持 7 并切换到使用 ToastNotification。
- 我特意在一个函数中定义了处理,这样我就可以调试和验证断点确实被击中了。

