5

对于一个大型项目,我将制作一个 C# 程序,它可以执行用户指定的各种操作,有一个用户界面,可以从系统图标访问,并且在屏幕上始终显示徽标。

我希望程序在启动时运行并一直在后台运行,直到关闭,例如当今许多常见的防病毒/恶意软件程序。

我还希望安装程序以便运行。

我知道这里有很多。我知道如何让程序在启动时运行(启动文件夹),但就像 AntiVirus 一样,我希望它始终存在,而不仅仅是在启动文件夹中......

我最初认为这是一项服务,但现在我不太确定,而且我正在做一场噩梦。做这个的最好方式是什么 ?GUI 是必须的。

将不胜感激任何和所有的答案、提示和建议。

提前致谢。

4

2 回答 2

10

防病毒程序和类似的系统托盘应用程序有时或经常有 2 个组件。有一个随系统启动的服务,启动文件夹中有一个单独的系统托盘应用程序,它与服务器交互以在用户登录到桌面时为用户提供对服务功能的访问。您必须回答的问题之一是您是否希望在无人登录时运行任何东西。如果是这样,您将需要一个服务组件。如果没有,您可以将所有内容放在一个创建系统托盘图标的应用程序中。要从 .NET 应用程序将图标放入系统托盘,请参阅http://www.developer.com/net/net/article.php/3336751/C-Tip-Placing-Your-C-Application-in-系统托盘.htm

如果我理解/回忆正确,有一个 .NET 组件设计用于将图标放入系统托盘。

于 2012-10-21T15:17:27.287 回答
1

这是我上面提到的示例。

此代码位于 TaskbarUtility 中,整个应用程序中的所有事件都通过这里创建新的表单。

我不确定这是否是执行此类操作的“正确”方式,并且我不打算进行线程劫持,但我想我不妨分享一下。:)

    List<CommonFormBase> activeWindows = new List<CommonFormBase>();

    public void LaunchApplication(ApplicationWindowType formTypeToLaunch)
    {
        CommonFormBase tempForm;
        switch (formTypeToLaunch)
        {
            //implement code to create a new form here
        }

        activeWindows.Add(tempForm);
        tempForm.Name = "UniqueName:" + System.DateTime.Now;
        tempForm.FormClosed += new FormClosedEventHandler(tempForm_FormClosed);
        tempForm.Show();
    }

    void tempForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        if (sender is CommonFormBase)
        {
            //Get the index of the selected form
            int index = -1;
            for (int i = 0; i <= this.activeWindows.Count - 1; i++)
            {
                if (this.activeWindows[i].Name == ((Form)sender).Name)
                    index = i;
            }

            //Remove the selected form from the list
            if (index >= 0)
                activeWindows.RemoveAt(index);

            //Close the TaskbarUtility if no remaining windows
            //  and user choose to exit when none remain
            if (this.activeWindows.Count == 0 && CloseWhenNoWindowsRemain)
            {
                this.Close();
            }
        }
    }

希望这是有道理的。

假设并非所有用户都希望应用程序一直运行,因此当他们启用该选项时,这将关闭整个程序。

于 2012-10-22T00:41:34.387 回答