Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

clipboard Listener event is being called twice

Tags:

c#

clipboard

i want to save the changes in my clipboard. so i registered my application to get all the changes that happens to the Clipboard.

Using

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

and then

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());
        }
}

The Problem is: When copying text from an application like visual studio or firefox, the OnClipboardChanged() function will be called twice or 3 times sometimes.

I think that those application will write the Data to the clipboard with different formats, this is why the function is called more than once. But how would i prevent saving the same data because OnClipboardChanged() is being called more than once ?

like image 551
lebhero Avatar asked Apr 29 '12 16:04

lebhero


1 Answers

Because they're opening/closing the clipboard multiple times. I've seen such madness before. Excel used to perform 24 separate operations when copying a chart.
Instead of this (pseudocode):

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

they're probably doing this:

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

Update: The usual mitigation strategy is to avoid reacting to every update, and react to the LAST update after a reasonable "settle time" has elapsed with no further clipboard notifications. 500ms will usually be more than adequate.

like image 194
Chris Thornton Avatar answered Oct 21 '22 07:10

Chris Thornton