4

我在 .net 中有一个应用程序,我希望它在没有任何手动交互的情况下始终打开。

在我使用的这个应用程序中NotifyIcon,它总是在任务栏托盘中启动,但通知图标只有在我手动打开它时才会显示.exe

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

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

所以这工作正常,重新启动时它成功地在系统任务栏进程列表中打开它,但不是作为任务栏托盘图标。

谁能帮我。?

4

2 回答 2

3

我也在使用 NotifyIcon,这有一些问题。首先,您需要为 NotifyIcon 设置一个图标,并确保您没有将其 Visibility 设置为 Visibility.Visible 以外的任何内容。

然后,NotifyIcon 只是 NotifyIcon Windows API 的一个包装器,并且有一个已知问题是它不能总是被创建。因此,当您初始化 NotifyIcon 时,它可能会因为 Windows 中的错误而引发异常(如果无法创建,WinApi 将返回 false,并且在源代码中它们会在那里引发异常)。当它这样做时,您可以在循环中重新创建 NotifyIcon 直到可以创建它。

当 NotifyIcon 不是在 app.xaml 中创建为 XAML 对象而是在代码中创建时,我还看到了一个问题,从那时起我总是在 XAML 中而不是在代码中创建它。现在我还从 CodeProject 导入了整个 NotifyIcon 项目,以便能够调试它的内部。所以现在我以这种方式创建它:

        <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;
    }
  }
}

您可以根据需要直接编辑代码,或者在出现异常时尝试重新创建通知图标。

我想这将是问题,因为它对我们来说是一样的,因为有时在启动后 Windows 还没有准备好创建图标。如果您还有其他问题,请发布您用于创建通知图标的代码和出现问题的系统(XP?64 位?)。

于 2013-08-09T16:09:10.693 回答
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());

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

于 2014-02-07T07:31:14.283 回答