C# Windows窗体应用程序在更改主题后退出

C# Windows窗体应用程序在更改主题后退出,c#,.net,winforms,themes,C#,.net,Winforms,Themes,我正在创建一个应用程序,它有一个RichTextBox,根据信息所代表的内容,文本具有不同的颜色(红色表示错误,黑色表示标准消息,等等)。我试图支持Windows主题,以及系统颜色的可能变化。为此,我创建了一种基于窗口系统颜色更改默认文本颜色的方法,通过使每种颜色变亮或变暗,使其对比度良好 然而,在测试这个系统时,我发现如果在程序运行时更改主题,它会自动退出,没有任何解释,甚至没有异常。它只是出口。我尝试在调用应用程序后放置一个断点。运行,Windows将挂起在浏览器修改主题时显示的“请稍候…”

我正在创建一个应用程序,它有一个
RichTextBox
,根据信息所代表的内容,文本具有不同的颜色(红色表示错误,黑色表示标准消息,等等)。我试图支持Windows主题,以及系统颜色的可能变化。为此,我创建了一种基于
窗口
系统颜色更改默认文本颜色的方法,通过使每种颜色变亮或变暗,使其对比度良好

然而,在测试这个系统时,我发现如果在程序运行时更改主题,它会自动退出,没有任何解释,甚至没有异常。它只是出口。我尝试在调用
应用程序后放置一个断点。运行
,Windows将挂起在浏览器修改主题时显示的“请稍候…”屏幕上。一分钟后,屏幕消失了,果然,断点被击中了,这意味着它不会完全终止进程

我的问题是,它为什么这样做,有什么方法可以阻止它这样做吗?


谢谢。

更好的调试方法是在表单中添加FormClosing事件处理程序并设置断点。当它中断时,callstack将显示调用Close()方法的代码


您正在使用的SystemEvents.UserPreferenceChanged事件的一个典型故障模式是在窗体关闭时忘记注销事件处理程序。这是一个静态事件,它将防止连接事件的窗体被垃圾回收。当事件激发时,很可能会得到ObjectDisposedException。但这只是一个猜测。

在做了很长时间的ASP.NET之后,当我开始做winforms时,令我惊讶的是,它只吃了一个字也没有的异常。您必须在try-catch块中包装应用程序

此外,您是否有:

   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);

呸!您是对的,在
FormClosing
事件上设置断点确实有帮助。似乎是在执行该操作的
WndProc
覆盖中调用了
Application.Exit()
。我有它,所以如果墙纸改变,应用程序退出。我通常只在其中一个配置中设置了编译符号,但不知怎的,它最终出现在我的调试配置中。别问我为什么墙纸换了就关上了,太复杂了。。。谢谢!