托盘图标应用程序未在指定条件下退出

时间:2013-12-27 22:44:39

标签: c# trayicon

我正在编写一个位于托盘图标中的应用程序,没有任何形式。

我已经实现了自定义ApplicationContext。此自定义ApplicationContext创建托盘图标并添加上下文菜单。如果我打开该上下文菜单并选择“退出”,则应用程序将按预期关闭。我还有一个包含应用程序将使用的功能的类。

代码如下:

public class MyClassApplicationContext : ApplicationContext
{
    public Container container;
    public NotifyIcon trayIcon;
    public ContextMenuStrip contextMenu;

    public MyClassApplicationContext()
    {
        InitializeContext();
    }

    private void InitializeContext()
    {
        container = new Container();
        contextMenu = new ContextMenuStrip(container);
        contextMenu.Items.Add("Salir");
        contextMenu.Items[0].Click += MenuExit_Click;
        trayIcon = new NotifyIcon(container);
        trayIcon.Icon = Resources.IconTray;
        trayIcon.ContextMenuStrip = contextMenu;
        trayIcon.Visible = true;
    }

    private void MenuExit_Click(object sender, EventArgs e)
    {
        ExitThread();
    }

    protected override void ExitThreadCore()
    {
        trayIcon.Visible = false;
        base.ExitThreadCore();
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && container!= null)
        {
            container.Dispose();
        }
        base.Dispose(disposing);
    }
}

public class MyClass
{
    public string fileName;

    public bool CheckConditions()
    {
        if (Environment.GetCommandLineArgs().Count() < 2)
        {
            MessageBox.Show("No file specified.");
            return false;
        }
        fileName = Environment.GetCommandLineArgs().ElementAt(1).ToString();
        if (!File.Exists(fileName))
        {
            MessageBox.Show("File specified does not exist.");
            return false;
        }
        return true;
    }
}

问题是,如果我在MyClassApplicationContext构造函数中添加以下内容:

MyClass main = new MyClass();
if (!main.CheckConditions())
{
    ExitThread();
}

应用程序处理托盘图标,但保持打开状态。

任何指示正确的方向来解决这个问题都将非常感激。

1 个答案:

答案 0 :(得分:2)

我会在启动应用程序之前检查条件

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        MyClass main = new MyClass();
        if (main.CheckConditions()) {
            MyClassApplicationContext context = new MyClassApplicationContext();
            Application.Run(context);
        }
    }
}

如果条件检查是上下文的公共成员,则可能更容易使用。

var context = new MyClassApplicationContext();
if (context.CheckConditions()) {
    Application.Run(context);
}

这个CheckConditions方法当然可以是一个包装器,它反过来调用MyClass的相应方法。