自动启动应用程序并使用托盘图标在任务栏中打开它

时间:2013-08-09 13:33:24

标签: c# .net autostart trayicon

我在.net中有一个应用程序,我希望它始终打开而无需任何手动交互。

在此应用程序中,我使用了NotifyIcon,因此它始终在任务栏托盘中启动,但只有在我手动打开.exe时才会显示通知图标。

所以我所做的就是在下面的帮助下将它添加到Autostart应用程序注册表项中:

RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
rkApp.SetValue("MyApp", Application.ExecutablePath.ToString());

所以这样可以正常工作,重启后它会在系统任务栏进程列表中成功打开它,但不能作为任务栏托盘图标。

任何人都可以帮助我。?

2 个答案:

答案 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());

现在,即使重新启动计算机,我也能看到红色图标。