WFA C#Clipboad Monitor bug - 链接重复

时间:2016-05-29 17:59:46

标签: c# clipboard

我在C#上写了剪贴板监听器WFA。有一个奇怪的错误。当我从任何浏览器的地址栏复制链接时 - 它会复制(相同的链接在输出窗口中出现两次)。当我从页面或任何其他地方复制纯文本或链接时 - 一切正常。

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

任何想法为什么会发生?提前谢谢。

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";
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我解决了这个问题,在显示之前将所有字符串放入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);
                }
            }