WinForm应用程序随机崩溃
我已经开发了捕获所有剪贴板文本的应用程序:WinForm应用程序随机崩溃
protected override void WndProc(ref Message m)
{
try
{
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
{
if (Clipboard.GetText() != string.Empty)
//I analyze the data then
if (ClipboardObject.CheckNewData(Clipboard.GetText()))
ClipboardObject.UpdateClipboardData(Clipboard.GetText());
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
}
case WM_CHANGECBCHAIN:
if (m.WParam == nextClipboardViewer)
nextClipboardViewer = m.LParam;
else
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
}
catch (Exception ex)
{
}
}
当事件被复活,我填的是数据在蜱是共享的,我的整个应用程序,然后在计时器对象每隔半秒我会不断检查这个对象是否有新的数据。
在每台PC机甚至当我的应用程序没有运行我已经安装上,奇怪的事情开始发生到Windows这个应用程序:
- Windows将随机
- 崩溃的一些电脑的Windows迷你冻结情况(与我发生的每一次)
- 有时窗口将尽快我按下鼠标崩溃右击任何文件夹或文件
我一直在挣扎这些问题很长一段时间,我真的找不到解决我的问题,任何帮助表示赞赏。 “
”收到WM_DRAWCLIPBOARD
消息的每个窗口都必须调用SendMessage函数将消息传递到剪贴板查看器链中的下一个窗口。“ 你确定总是发生?你应该尝试......终于在那里阻塞(事实上,如果数据不是文本的,GetText可能会抛出)。
WM_CHANGECBCHAIN
也可能非常棘手 - 您是否在应用程序退出后自行清理?你必须使用ChangeClipboardChain
再次删除自己,否则你会在剪贴板链中留下悬挂的指针!
基本上,当您的窗体关闭(和它的手柄是越来越设置 - 但它确实设置之前),你需要调用是这样的:
ChangeClipboardChain(this.Handle, nextClipboardViewer);
剪贴板的变化是非常脆 - 一个崩溃的应用程序可能会导致破碎的剪贴板。在.NET中,至少尝试使用终结器来处理这个问题(即便如此,这将会非常棘手) - 事实上,将剪贴板绑定到其他东西而不是实际的窗口可能不是一个坏主意(所以您可以正确地实施dispose-finalize模式),但这取决于您。另外,看到这个问题: Can aborting a process without resetting the clipboard chain cause trouble?
注意,即使在当时,有人可以只处理杀死你的应用程序(这是原因任务管理器警告你不要杀的过程的一个 - 在这种情况下,它真的将让你应用不稳定)。三重检查一切,确保你在每种可能的情况下处理CB链(除了不可避免的进程杀 - 除了这种方式,有一些方法可以解决这个问题,但是,嘿,如果用户在屁股中,让他) ,否则你会让你的电脑非常不稳定。
您的信息非常有帮助,我会尝试您提到的一切,希望它能起作用 – ykh
我在这里没有看到任何COM? – Thorarin
*即使当我的应用程序没有运行时*听起来像忘了删除已安装的钩子。 – Sinatr
你能告诉我如何删除钩子?这是否意味着我每次运行应用程序时都附加了一个钩子,这意味着有多个钩子正在运行,或者只能连接一个钩子?无论如何检查是否已经有挂钩了吗? – ykh