我想保存剪贴板中的更改.所以我注册了我的应用程序以获取剪贴板发生的所有更改.
运用
[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()被多次调用?
因为他们多次打开/关闭剪贴板.我以前见过这样的疯狂.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毫秒通常是足够的.