c# - Application.Exit需要调用两次

标签 c# .net winforms pinvoke

我有一个 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# 世界的新手。 SysTrayAppMouseHook 应该合并成一个大类吗? 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/

相关文章:

c# - 如何在 C# 中以编程方式创建柔和的颜色?

c# - 单击用户控件时如何防止窃取焦点?

具有接口(interface)类型约束的 C# 泛型方法

.net - 为 .Net 开发推荐一本好的设计和架构书

.net - 批准后使用 jenkinsfile 构建推广

.net - 在 Visual Studio 设计器中公开枚举(标志)集合

c# - 通过发送信号向下滚动网络浏览器

c# - 将数据从 View 传递到 Controller asp.net core razor 页面

c# - WPF BitmapSource 图像源

C# 在对它们执行某些操作之前检查 COM 对象是否可用