剪贴板侦听器事件被调用两次

leb*_*ero 3 c# clipboard

我想保存剪贴板中的更改.所以我注册了我的应用程序以获取剪贴板发生的所有更改.

运用

    [DllImport("User32.dll")]
    protected static extern bool AddClipboardFormatListener(int hwnd);
Run Code Online (Sandbox Code Playgroud)

然后

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());
        }
}
Run Code Online (Sandbox Code Playgroud)

问题是:当从visual studio或firefox等应用程序复制文本时,OnClipboardChanged()函数有时会被调用两次或三次.

我认为那些应用程序会将数据写入不同格式的剪贴板,这就是为什么函数不止一次被调用.但是我如何防止保存相同的数据,因为OnClipboardChanged()被多次调用?

Chr*_*ton 7

因为他们多次打开/关闭剪贴板.我以前见过这样的疯狂.Excel用于在复制图表时执行24个单独的操作.
而不是这个(伪代码):

openClipboard
for each format {
  place data on clipboard(format)
}
closeClipboard
Run Code Online (Sandbox Code Playgroud)

他们可能会这样做:

for each format {
  openClipboard
  place data on clipboard(format)
  closeClipboard
}
Run Code Online (Sandbox Code Playgroud)

更新:通常的缓解策略是避免对每次更新做出反应,并在经过合理的"结算时间"后对LAST更新作出反应,而不再进行剪贴板通知.500毫秒通常是足够的.