我在.net中有一个应用程序,我希望它始终打开而无需任何手动交互。
在此应用程序中,我使用了NotifyIcon
,因此它始终在任务栏托盘中启动,但只有在我手动打开.exe
时才会显示通知图标。
所以我所做的就是在下面的帮助下将它添加到Autostart应用程序注册表项中:
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
rkApp.SetValue("MyApp", Application.ExecutablePath.ToString());
所以这样可以正常工作,重启后它会在系统任务栏进程列表中成功打开它,但不能作为任务栏托盘图标。
任何人都可以帮助我。?
答案 0 :(得分:3)
我也在使用NotifyIcon,并且存在一些问题。首先,你需要为NotifyIcon设置一个Icon,并确保你没有将它的可见性设置为Visibility.Visible以外的任何东西。
然后,NotifyIcon只是NotifyIcon Windows API的包装器,并且存在一个已知问题,即无法始终创建它。因此,当您初始化NotifyIcon 时,由于Windows中的错误,它可能会抛出异常(如果无法创建WinApi,则返回false,并且在源代码中,它们会在那里抛出异常)。当它这样做时,您可以在循环中重新创建NotifyIcon,直到可以创建它。
有时我在app.xaml中没有将NotifyIcon创建为XAML对象,但在代码中,我也看到了一个问题,因为那时我总是在XAML而不是代码中创建它。此外,我现在导入whole NotifyIcon project from CodeProject以便能够调试它的内部。所以现在我以这种方式创建它:
<NotifyIcon1:NotifyIcon x:Key="NotifyIcon" x:Name="notifyicon"
ToolTipText="" Visibility="Visible" IconSource="/Images/Icons/bulb.ico"/>
如果无法在NotifyIcon库的代码的这一部分中创建图标,则应抛出异常:
/// <summary>
/// Creates the taskbar icon. This message is invoked during initialization,
/// if the taskbar is restarted, and whenever the icon is displayed.
/// </summary>
private void CreateTaskbarIcon()
{
lock (this)
{
if (!IsTaskbarIconCreated)
{
const IconDataMembers members = IconDataMembers.Message
| IconDataMembers.Icon
| IconDataMembers.Tip;
//write initial configuration
var status = Util.WriteIconData(ref iconData, NotifyCommand.Add, members);
if (!status)
{
throw new Win32Exception("Could not create icon data");
}
//set to most recent version
SetVersion();
messageSink.Version = (NotifyIconVersion) iconData.VersionOrTimeout;
IsTaskbarIconCreated = true;
}
}
}
您可以根据需要直接编辑代码,也可以尝试在出现异常时重新创建notifyicon。
我想这将是问题,因为它对我们来说是一样的,因为有时在启动Windows尚未准备好创建图标之后。如果您有其他问题,请发布用于创建发布问题的notifyicon和系统(XP?64bit?)的代码。
答案 1 :(得分:0)
我使用图标的方式存在问题。
我们在NotifyIcon
中使用的“图标”文件可能存在问题,所以我只是通过替换方式解决了这个问题
// START: Creating a red graphic instead of image
Bitmap b = new Bitmap(16, 16);
Graphics g = Graphics.FromImage(b);
g.Clear(Color.Transparent);
SolidBrush sb = new SolidBrush(Color.Red);
g.FillEllipse(sb, 0, 0, 16, 16);
// END: Creating a red graphic instead of image
m_notifyicon.Visible = true;
m_notifyicon.Icon = Icon.FromHandle(b.GetHicon());
现在,即使重新启动计算机,我也能看到红色图标。