【问题标题】:Tray Application that runs for a long time [duplicate]长时间运行的托盘应用程序[重复]
【发布时间】:2012-04-18 13:49:28
【问题描述】:

可能重复:
Writing a Windows system tray application with .NET

我想开发一个托盘应用程序。这应该做的是它必须继续寻找最近修改的文件。一旦文件被捕获,它就会将该文件的副本复制到 Web 服务器。因此,用户将能够登录网站,稍后用户将能够下载这些备份文件。我想知道的是如何开发托盘应用程序?我必须为此编写一个 Windows 服务吗?如果是这样,我需要一个托盘应用程序来控制服务(托盘应用程序必须具有启动和停止服务 [备份服务] 的功能,选择文件扩展名的选项) 我正在使用 C#。 提前非常感谢。

【问题讨论】:

  • 是什么让您认为您想要一个带有托盘图标的桌面应用程序?为什么不是服务?
  • @David Heffernan 实际上这是我的项目。但我不知道如何实现这一点。这是一个自动备份系统。所以我需要一个托盘应用程序来监视文件修改并将修改后的文件发送到 Web 服务器。然后用户将能够在以后需要时下载这些文件。希望你明白我的意思。请建议我如何使用这个监视文件修改的托盘应用程序。必须像卡巴斯基杀毒软件一样在托盘上继续运行。
  • 嗯,服务似乎更适合我。您是否熟悉 Windows 服务和桌面应用程序之间的区别?

标签: c# windows-services system-tray


【解决方案1】:

我个人不会让它像Windows Service,但会选择一个简单的应用程序“生活”在系统后面。更容易维护和更新,从客户端卸载(根据他的要求)。简而言之,对于一些简单的事情,我不会选择 Windows 服务。

我会添加一个带有一些菜单的系统托盘组件。 你可以看看 Philipp Sumi 的WPF NotifyIcon

其中一个菜单项可以有一项注册可执行文件以在操作系统启动时运行。 您可以使用以下代码来实现:

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
Assembly curAssembly = Assembly.GetExecutingAssembly();
key.SetValue(curAssembly.GetName().Name, curAssembly.Location);

如果由于某种原因,由于您的帖子不是很清楚,您的应用程序确实会在相当大的生产环境中管理大量数据,使用 WindowsService 并管理所有与它相关的东西。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    听起来很简单。

    创建一个基本的 WinForms 应用程序。应用程序的主窗口应该开始“最小化”并且不应该显示在任务栏中。但是,它应该有一个“NotifyIcon”组件,它允许应用程序显示在系统托盘中。双击 NotifyIcon 将恢复窗口,在任务栏中显示窗口并隐藏 NotifyIcon,直到窗口被最小化或再次关闭。

    此应用程序可以自己进行文件监视,也可以编辑 Windows 服务使用的配置;无论哪种方式都可以。无论哪种方式,您都需要设置一个 FileSystemWatcher(或其中几个)来监视用户希望您检查的目录中的文件。当 FileSystemWatcher 看到文件更改时,它会触发一个事件,您可以通过执行上传到 Web 服务器来处理该事件。

    作为整个设计的旁白;如果您正在实施在线备份系统(您似乎是这样),我会确保用户可以访问该文件的几次过去迭代,以防他们想要恢复以前的版本。您还应该进行病毒检查;用户最不需要的就是病毒破坏他们的文件,并让您的备份系统备份被破坏的文件。

    【讨论】:

    • 嗯,我按照你说的实现了托盘应用程序。非常感谢。
    猜你喜欢
    • 2023-03-26
    • 2018-02-24
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多