关于SO的问题有很多疑问.解决方案是设置
notifyIcon.icon = null并Dispose在FormClosing事件中调用它.
在我的应用程序中,没有这样的表单,但有通知图标更新事件.在创作时,我隐藏了我的形式并制作了ShowInTaskbar财产false.因此,我不能有"FormClosing"或"FormClosed"事件.
如果此应用程序获取退出事件,则调用Process.GetCurrentProcess().Kill();退出.
我notifyIcon.icon = null在杀戮之前添加了Dispose,但仍然将图标保留为任务栏,直到我将鼠标悬停在它上面.
编辑:如果我认为这种行为是由于调用GetCurrentProcess().Kill(),是否有任何优雅的方式退出应用程序,这将清除所有资源并从系统托盘中删除图标.
我想让它左键单击NotifyIcon也会导致上下文菜单(使用ContextMenuStrip属性设置)也打开.我怎么做到这一点?我是否必须自己处理Click并找出定位?
编辑:使用trayIcon.ContextMenuStrip.Show()显示菜单结果是一些不良行为:
菜单未显示在同一位置,就像右键单击NotifyIcon一样(看起来您无法将x和y坐标设置为任务栏所在的位置,至少在我正在运行的Windows 7上).它将显示在任务栏上方(不是很大的交易,但一致性会很好).
显示菜单时,任务栏中会添加一个额外的图标.
单击菜单以外的其他位置不会关闭它(如果右键单击以显示上下文菜单,则单击其他位置会自动关闭上下文菜单).
是否可以只调用菜单,但内置的右键单击处理程序正在执行此操作?
我正在尝试使用以下代码来显示气球通知.我已经验证它是使用断点执行的.它也没有显示任何错误.
我应该怎么做来调试这个,因为它不会抛出错误而不显示气球?
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);
}
Run Code Online (Sandbox Code Playgroud) 我想将C#WinForms应用程序最小化到系统托盘.我试过这个:
单击按钮时应用程序最小化到系统托盘?.我第一次最小化它,它在屏幕上找不到 - 任务栏/任务栏/托盘上方.
如果我点击alt标签,我可以看到我的应用程序; 如果我将选项卡添加到其中并再次将其最小化,它将显示在任务栏上方:

我究竟做错了什么?
我完成了我的应用程序,现在我希望将"最小化到系统托盘功能"中.我读了一篇很好的文章, 最小化app到系统托盘.我意识到这些都使用了Windows.Form类.
不幸的是,我使用Windows Presentation Foundation WPF参考来制作我的应用程序UI.现在我看到WPF不支持NotifyIcon.我看到CodePlex上有一个开源库,模拟NotifyIcon属性WPF Contrib我尚未使用它.
现在我正在解决问题.以下是我的问题: -
a)我不想仅为一个组件合并第三方库.
b)我可以在WPF上没有NotifyIcon的情况下进行最小化功能吗?如果是,那么有人可以给我带来什么样的优惠?
或者也许我应该将我的UI恢复为使用Windows窗体?
如何将NotifyIcon设置为始终在右侧托盘中可见:http: //screensnapr.com/v/qKWHe2.png
因为它将其转移到非活动图标窗口:http: //screensnapr.com/v/jjtuK0.png
问题是托盘图标有一个上下文菜单,可以让某人拍摄屏幕截图.因此,每次他们拍摄截图时,图片中都会显示不活动的图标窗口,阻挡其背后的任何内容,如照片轰炸机.
我知道可以通过代码完成它,因为其他应用程序(如comodo)已经完成了它而没有让我拖放图标到那里.为了创建任务栏的快捷方式,我了解到你在这个文件夹中设置了一个快捷方式:
C:\Users\Username\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
Run Code Online (Sandbox Code Playgroud)
托盘有类似的东西吗?或者有一个选项我可以使用代码明智.
我知道如何在Windows通知区域(系统托盘)中放置一个图标.
有图标动画的最佳方法是什么?你可以使用动画gif,还是你必须依赖计时器?
我正在使用C#和WPF,但WinForms也接受了.
我试图在系统托盘中显示2-3个可更新的字符,而不是显示.ico文件 - 类似于CoreTemp在系统中显示温度时的操作尝试:
我在WinForms应用程序中使用NotifyIcon以及以下代码:
Font fontToUse = new Font("Microsoft Sans Serif", 8, FontStyle.Regular, GraphicsUnit.Pixel);
Brush brushToUse = new SolidBrush(Color.White);
Bitmap bitmapText = new Bitmap(16, 16);
Graphics g = Drawing.Graphics.FromImage(bitmapText);
IntPtr hIcon;
public void CreateTextIcon(string str)
{
g.Clear(Color.Transparent);
g.DrawString(str, fontToUse, brushToUse, -2, 5);
hIcon = (bitmapText.GetHicon);
NotifyIcon1.Icon = Drawing.Icon.FromHandle(hIcon);
DestroyIcon(hIcon.ToInt32);
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这产生的结果不如CoreTemp得到的结果:
您认为解决方案是增加字体大小,但超过8的任何内容都不适合图像.将位图从16x16增加到32x32也没有任何作用 - 它会调整大小.
然后就是我想要显示"8.55"而不是"55"的问题 - 图标周围有足够的空间但看起来无法使用.
有一个更好的方法吗?为什么Windows可以执行以下操作,但我不能?
更新:
感谢@NineBerry提供了一个很好的解决方案.要添加,我发现Tahoma是最好使用的字体.
我想使用WPF最小化应用程序到系统托盘."NotifyIcon"是实现这一结果的唯一方法吗?如果是,在WPF中使用"NotifyIcon"需要哪个命名空间?
如果可能使用"NotifyIcon",请提供一些提示,我如何在主窗口中使用它?
我的主窗口是,
public partial class MonthView : MetroWindow
{
public DateTime SelectedDate { get; set; }
public MonthView()
{
InitializeComponent();
calMain.DisplayDate = DateTime.Today;
Globals._globalController = new AppController();
Globals._globalController.appTaskManager.setupLocal();
Globals._globalController.setMonthViewWindow(this);
}
public void calItemSelectedDate(object sender, SelectionChangedEventArgs e)
{
DateTime d;
if (sender is DateTime)
{
d = (DateTime)sender;
}
else
{
DateTime.TryParse(sender.ToString(), out d);
}
SelectedDate = d;
ShowActivity(d);
}
public void ShowActivity(DateTime date)
{
DayView Activity = new DayView(date);
Activity.Show();
this.Hide();
}
private void SetButton_Click(object sender, RoutedEventArgs e)
{ …Run Code Online (Sandbox Code Playgroud) 我有一个.Net 3.5 C#Winforms应用程序.它没有GUI,只有一个带有ContextMenu的NotifyIcon.
我试图将NotifyIcon设置为visible = false并将其在Application_Exit事件中处理,如下所示:
if (notifyIcon != null)
{
notifyIcon.Visible = false;
notifyIcon.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
应用程序获取括号内的代码,但在尝试设置Visible = false时抛出空引用异常.
我已经阅读了几个地方,把它放在表格结束事件中,但是那个代码永远不会被击中(可能因为我没有这样的表格?).
我在哪里可以放置这些代码,以便实际工作?如果我没有把它放入,我会在托盘中看到烦人的挥之不去的图标,直到你将鼠标移到它上面.
干杯.
编辑
只是我注意到了一些额外的东西...........
我在应用程序中使用ClickOnce .........如果我只是通过NotifyIcon上的ContextMenu退出应用程序,则不会记录任何异常.
就在应用程序在此处检查升级后触发Application_Exit事件时...
private void CheckForUpdate()
{
EventLogger.Instance.LogEvent("Checking for Update");
if (ApplicationDeployment.IsNetworkDeployed && ApplicationDeployment.CurrentDeployment.CheckForUpdate())
{
EventLogger.Instance.LogEvent("Update available - updating");
ApplicationDeployment.CurrentDeployment.Update();
Application.Restart();
}
}
Run Code Online (Sandbox Code Playgroud)
这有帮助吗?
c# ×10
notifyicon ×10
winforms ×5
.net ×4
windows ×3
wpf ×3
system-tray ×2
trayicon ×2
wpf-controls ×2