2012-04-29 44 views
3

我想將更改保存在剪貼板中。所以我註冊了我的應用程序以獲取剪貼板發生的所有更改。剪貼板監聽器事件被調用兩次

使用

[DllImport("User32.dll")] 
    protected static extern bool AddClipboardFormatListener(int hwnd); 

然後

protected override void WndProc(ref Message m) 
    { 
switch (m.Msg) 
     { 
      case WM_CLIPBOARDUPDATE: 
       OnClipboardChanged(); 
       break; 
      ... 
     } 
    } 

private void OnClipboardChanged() 
{ 
    if (Clipboard.ContainsText()) 
     { 
     MessageBox.Show(Clipboard.GetText().ToString()); 
     } 
} 

存在的問題是: 當從如Visual Studio或Firefox,所述OnClipboardChanged()的應用程序複製文本功能將被調用兩次或3倍有時。

我認爲那些應用程序會以不同的格式將數據寫入剪貼板,這就是爲什麼該函數被多次調用。 但是,我將如何防止保存相同的數據,因爲OnClipboardChanged()被多次調用?

+0

Message(m)參數中是否存在與寫入剪貼板的每個實例相同的屬性?也許是ID?如果是這樣,也許你可以忽略這個消息,如果你已經處理了該消息/ ID? –

+0

嗨鮑勃, 我找不到任何有關msg id或類似的東西..這是一個真正的好主意,並且如果每個msg都有一個「call id」謝謝 – lebhero

回答

6

因爲他們多次打開/關閉剪貼板。我以前見過這樣的瘋狂。複製圖表時,Excel用於執行24個獨立的操作。
取而代之的是(僞):

openClipboard 
for each format { 
    place data on clipboard(format) 
} 
closeClipboard 

他們很可能這樣做:

for each format { 
    openClipboard 
    place data on clipboard(format) 
    closeClipboard 
} 

更新:通常的緩解策略是爲了避免反應,每一次更新,並作出反應,最後更新經過合理的「解決時間」後,沒有進一步的剪貼板通知。 500毫秒通常會綽綽有餘。

+0

嗨..感謝您的回答...我如何確保我只能調用一次函數?我如何檢查剪貼板中的數據是否沒有改變,但是像上面說的那樣被重寫了? 我只想保存HTML如果可用,如果不是,我需要獲取文本..但重寫剪貼板,因爲你提到的是有時調用函數兩次甚至3次,所以我不能決定是否我必須保存數據存在於剪貼板中還是不存在!? – lebhero

+0

偶處理程序將爲每個剪貼板更新調用一次(通常爲WM_DrawClipboard消息)。讓它只調用一次的唯一方法就是糾正正在執行更新的程序,這超出了你的控制範圍。請參閱我上面的更新以瞭解緩解策略。 –

+0

謝謝克里斯..我會接受你的答案,因爲它似乎是唯一可行的方式......感謝你的想法.. – lebhero