我的WPF应用程序随机崩溃(但每天至少两次)出现问题,在Windows应用程序日志中留下以下消息:
应用程序:AppName.exe 框架版本:v4.0.30319 描述:由于.NET运行时在IP xxxxxxxx(xxxxxxxx)处出现内部错误而导致该进程终止,退出代码为80131506。
为了给你背景知识,这个应用程序在运行Windows Embedded Standard 2009的嵌入式系统上运行,并且与另一个进程一起是设备上运行的唯一应用程序(甚至资源管理器也被禁用,因为它不需要)。
经过一些反复试验,我已经隔离了触发错误的代码。它是安装在主窗口上的挂钩,用于拦截HWND消息,以了解显示器何时关闭或处于待机模式。 由于系统配备了触摸面板,我在显示器关闭时用面板覆盖我的应用程序主窗口,因此当用户触摸显示器使其退出待机模式时,它不会错误地点击我的其中一个按钮主窗口。当面板本身发生“点击”事件时,它会关闭,消失,从而允许用户恢复正常的操作。
这是我如何实例化钩子和截获hwnd时调用的函数:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WindowInteropHelper helper = new WindowInteropHelper(this);
HwndSource.FromHwnd(helper.Handle).AddHook(HwndSourceHookHandler);
}
private IntPtr HwndSourceHookHandler(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
handled = false;
if (msg == WM_SYSCOMMAND && wParam == (IntPtr)SC_MONITORPOWER)
{
if (lParam == (IntPtr)MONITOR_OFF || lParam == (IntPtr)MONITOR_STANDBY)
{
AppName.Shell.canvasStandBy.Visibility = System.Windows.Visibility.Visible;
}
}
return IntPtr.Zero;
}
如果我注释掉Window_Loaded位中的代码,则崩溃不再发生...... 你能指出这段代码有什么问题吗?或者给我一个提示,让它有另外一种方法可以让用户在显示器关闭时点击显示器不会到达底层主窗口?
提前感谢您的帮助:)
答案 0 :(得分:0)
解决了这个问题。 @HansPassant是对的。 REAL问题不是使用钩子调用,而是使用外部的第三方DLL(包含应用程序中使用的一些自定义控件)使用了一些错误签名的P / INVOKES。 Hook调用只是通过某种方式强制垃圾收集器在没有人使用设备的情况下进行干预,从而检测到自实例化自定义控件以来一直存在的堆损坏。 解决方案是:从开发人员那里获得一个更新的,修复的DLL,问题就不复存在了:) 谢谢大家的帮助。