WFA C# 剪贴板监视器错误 - link 重复

WFA C# Clipboad Monitor bug - link duplications

我用 C# 编写了剪贴板侦听器 WFA。有一个奇怪的错误。当我从任何浏览器的地址栏复制 link - 它会复制(相同的 link 在输出 window 中出现两次)。当我从页面或任何其他地方复制纯文本或 link - everething 工作正常。

调试应用程序显示在第一种情况下侦听器调用了两次。

知道为什么会这样吗?提前致谢。

public partial class ClassCapture: Form
{
    string bufferText;
    private const int WM_DRAWCLIPBOARD = 0x0308;
    private IntPtr _clipboardViewerNext;

    public ClassCapture()
    {
        InitializeComponent();
    }

    private void start_capture(object sender, EventArgs e)
    {
        addToChain();
    }

    private void stop_capture(object sender, EventArgs e)
    {
        removeFromChain();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        removeFromChain();
    }

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

    public void addToChain()
    {
        _clipboardViewerNext = SetClipboardViewer(this.Handle); 
    }

    public void removeFromChain()
    {
        ChangeClipboardChain(this.Handle, _clipboardViewerNext);
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);    // Process the message 

        if (m.Msg == WM_DRAWCLIPBOARD)
        {
            IDataObject iData = Clipboard.GetDataObject();

            if (iData.GetDataPresent(DataFormats.Text))
            {
                bufferText = (string)iData.GetData(DataFormats.Text);      
                if (bufferText != "") {
                    ClipboardHistory.Text = ClipboardHistory.Text + bufferText + "\n";
                }
            }
        }
    }
}

我解决了这个问题,在显示之前将所有字符串放入 HashSet - 这就是过滤重复项的方法。 我仍然不明白为什么从浏览器的地址栏复制链接会调用两次监听器,但最终结果对我来说是可以接受的。

HashSet<string> textHistory = new HashSet<string>();

// ....

            if (iData.GetDataPresent(DataFormats.Text))
            {
                bufferText = (string)iData.GetData(DataFormats.Text);      // Clipboard text
                if (bufferText != "") {
                    textHistory.Add(bufferText);
                    ClipboardHistory.Text = String.Join(Environment.NewLine, textHistory);
                }
            }