我有一个 Main 方法,它创建一个名为 SysTrayApp 的消息循环:
void Main()
{
Application.Run(new SysTrayApp());
}
我的 SysTrayApp 类将 ContextMenu 添加到系统托盘图标,然后启动另一个名为 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# 世界的新手。 SysTrayApp
和 MouseHook
应该合并成一个大类吗? MouseHook
似乎也不应该与 Windows.Form 分开。也许 MouseHook
需要在新线程上?有什么建议吗?
编辑:糟糕。 MouseHook
没有第三个 Application.Run()
解决方案
我想我想多了。就像我说的,仍在探索 C#。但这是有效的:
Application.Run(new SysTrayApp());
在 Main()
中是您所需要的。要启动 MouseHook
,只需在 SysTrayApp
中执行 MouseHook hook = new MouseHook();
。
感谢@JonSkeet 帮助我理解这一点。你是一台机器!
最佳答案
您在 MouseHook
构造函数中调用 Application.Run
,然后当它返回时,您将调用 Application。再次运行
(在SysTrayApp
构造函数中)- 当SysTrayApp
构造函数完成时,您将第三次 调用它。如果你要运行三个不同的消息循环,你应该预计必须退出三次(我很惊讶你只需要调用 Application.Exit
两次)。
你不应该在你的构造函数的任一个中调用Application.Run
- 构造函数阻塞直到消息泵完成的想法是令人讨厌的,IMO。如果您真的想要多个消息循环,它们应该在不同的线程上——但我不建议您这样做。您只需在Main
方法中调用Application.Run
就可以了。
关于c# - Application.Exit需要调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992165/