2013-12-20 146 views
1

我已經開發了捕獲所有剪貼板文本的應用程序: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

回答

3

」收到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