Application.Exit需要调用两次

时间:2012-01-24 18:37:46

标签: c# .net winforms pinvoke

我有一个Main方法,它创建一个名为SysTrayApp的消息循环:

void Main()
{
    Application.Run(new SysTrayApp());
}  

我的SysTrayApp类将ContextMenu添加到System Tray图标,然后启动另一个名为MouseHook的消息循环。 MouseHook是一个用于管理鼠标事件的类。 (以this课程为模型。)

class SysTrayApp : Form
{           
    public SysTrayApp()
    {
        // Does some GUI work    
        // Then starts another message loop
        Application.Run(new MouseHook());
    }
}

_

class MouseHook : Form
{           
    public MouseHook()
    {
        // Does some hooking stuff      
    }
}

在SysTrayApp中,当用户从上下文菜单中选择“退出”选项时,将调用Application.Exit()。问题是我必须调用Exit两次(或添加另一个Application.Exit)才能结束应用程序。这是预期的,但是 我觉得我这样做是错误的。两次调用Application.Exit()对我来说似乎不对,但我是C#世界的新手。 SysTrayAppMouseHook应该组合成一个大班吗? MouseHook似乎不应该是Windows.Form的一部分。也许MouseHook需要在新线程上?有什么建议吗?

编辑:哎呀。 MouseHook没有第三个Application.Run()

解决方案

我想我一直在想这个。还在探索C#,就像我说的那样。但这是有效的:

Application.Run(new SysTrayApp());中的{p> Main()就是您所需要的。要开始MouseHook,只需在MouseHook hook = new MouseHook();中执行SysTrayApp

感谢@JonSkeet帮助我理解这一点。你是一台机器!

1 个答案:

答案 0 :(得分:8)

您正在Application.Run构造函数中调用MouseHook ,然后当它返回时,您再次调用Application.RunSysTrayApp构造函数) - 当SysTrayApp构造函数完成时,您将其称为第三时间。如果你要运行三个不同的消息循环,你应该不得不退出三次(我很惊讶你只需要两次调用Application.Exit

你不应该在构造函数的 中调用Application.Run - 在消息泵完成之前构造函数阻塞的想法是令人讨厌的,IMO。如果确实想要多个消息循环,它们应该在不同的线程上 - 但我不建议你这样做。您应该只是Application.Run方法中调用Main