我有一个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#世界的新手。 SysTrayApp
和MouseHook
应该组合成一个大班吗? MouseHook
似乎不应该是Windows.Form的一部分。也许MouseHook
需要在新线程上?有什么建议吗?
编辑:哎呀。 MouseHook
没有第三个Application.Run()
我想我一直在想这个。还在探索C#,就像我说的那样。但这是有效的:
Application.Run(new SysTrayApp());
中的{p> Main()
就是您所需要的。要开始MouseHook
,只需在MouseHook hook = new MouseHook();
中执行SysTrayApp
。
感谢@JonSkeet帮助我理解这一点。你是一台机器!
答案 0 :(得分:8)
您正在Application.Run
构造函数中调用MouseHook
,然后当它返回时,您再次调用Application.Run
(SysTrayApp
构造函数) - 当SysTrayApp
构造函数完成时,您将其称为第三时间。如果你要运行三个不同的消息循环,你应该不得不退出三次(我很惊讶你只需要两次调用Application.Exit
。
你不应该在构造函数的 中调用Application.Run
- 在消息泵完成之前构造函数阻塞的想法是令人讨厌的,IMO。如果确实想要多个消息循环,它们应该在不同的线程上 - 但我不建议你这样做。您应该只是在Application.Run
方法中调用Main
。