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迷你冻结情况(与我发生的每一次)
  • 有时窗口将尽快我按下鼠标崩溃右击任何文件夹或文件

我一直在挣扎这些问题很长一段时间,我真的找不到解决我的问题,任何帮助表示赞赏。 “

+0

我在这里没有看到任何COM? – Thorarin

+0

*即使当我的应用程序没有运行时*听起来像忘了删除已安装的钩子。 – Sinatr

+0

你能告诉我如何删除钩子?这是否意味着我每次运行应用程序时都附加了一个钩子,这意味着有多个钩子正在运行,或者只能连接一个钩子?无论如何检查是否已经有挂钩了吗? – ykh

”收到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链(除了不可避免的进程杀 - 除了这种方式,有一些方法可以解决这个问题,但是,嘿,如果用户在屁股中,让他) ,否则你会让你的电脑非常不稳定。

+0

您的信息非常有帮助,我会尝试您提到的一切,希望它能起作用 – ykh