C# 需要调用Application.Exit两次

C# 需要调用Application.Exit两次,c#,.net,winforms,pinvoke,C#,.net,Winforms,Pinvoke,我有一个主要的方法来创建一个名为SysTrayApp的消息循环: void Main() { Application.Run(new SysTrayApp()); } 我的SysTrayApp类在系统托盘图标中添加了一个ContextMenu,然后启动另一个名为MouseHook的消息循环。MouseHook是一个PinVoke鼠标事件的类。(仿效课堂。) _ 在SysTrayApp中,当用户从关联菜单中选择退出选项时,将调用Application.Exit()。问题是我必须调用E

我有一个主要的方法来创建一个名为SysTrayApp的消息循环:

void Main()
{
    Application.Run(new SysTrayApp());
}  
我的SysTrayApp类在系统托盘图标中添加了一个ContextMenu,然后启动另一个名为
MouseHook
的消息循环。MouseHook是一个PinVoke鼠标事件的类。(仿效课堂。)

_

在SysTrayApp中,当用户从关联菜单中选择退出选项时,将调用
Application.Exit()
。问题是我必须调用Exit两次(或者添加另一个
应用程序。Exit
)才能结束应用程序。这是意料之中的,但是 我觉得我走错了方向。调用
Application.Exit()
两次对我来说似乎是错误的,但我对C世界还是新手。
SysTrayApp
MouseHook
应该合并成一个大类吗
MouseHook
似乎不应该是Windows的一部分。也许
MouseHook
需要在新线程上?有什么建议吗

编辑:Oops
MouseHook
没有第三个
应用程序。Run()

解决方案 我想我是想得太多了。就像我说的,还在探索C#。但以下是有效的方法:

Application.Run(新的SysTrayApp())Main()
中的code>就是您所需要的全部。要启动
MouseHook
,只需执行
MouseHook hook=newmousehook()
SysTrayApp


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

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


你不应该调用
应用程序。在你的任何一个构造函数中运行
——在消息泵完成之前,构造函数阻塞的想法是令人讨厌的,依我看。如果你真的想要多个消息循环,它们应该在不同的线程上——但我不建议你这样做。只要调用
应用程序就可以了。在
Main
方法中运行

我知道为什么会发生这种情况。我可以通过调用
Application.Exit
两次来解决这个问题。但我想知道这是否被认为是不好的做法。像这样看吧。你的呼叫应用程序。运行两次。该名称表示您希望运行应用程序两次。但这一切都在同一个应用程序中。所以1 Appliction.Run,对于你的鼠标钩子,你可以使用一个线程。@因为我相信
回答了这个问题,构造函数在消息泵完成之前阻塞消息的想法是令人讨厌的,依我看
。为什么您首先要创建两个一个无法完成的消息循环?@aus:调用
应用程序。从构造函数运行
?是的,那绝对被认为是不好的做法。你为什么要这么做?解决方法不是调用
应用程序。退出
两次-而是只调用
应用程序。运行
一次。@因为您只需创建一个新的鼠标指针表单,就不需要使用应用程序。使用它运行。
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      
    }
}