我在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";
}
}
}
}
}
答案 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);
}
}