我有一些在Windows剪贴板上处理文本的软件。具体来说,它将从剪贴板文本的开头删除下划线_
(并返回字符),然后检查其余文本是否为URL。如果是,则不带下划线的URL存储在剪贴板上,否则保留原始文本。为了监视剪贴板中的更改,我使用了DBKK提供的this question答案中的代码。它可以正常工作,但是会在5分钟到约24小时之间的任意一段时间后随机停止工作。
下面是剪贴板事件触发器上调用的代码:
private void clipboardMonitor_ClipboardChanged(object sender, ClipboardAssist.ClipboardChangedEventArgs e)
{
lock(lockVar)
{
if (locked)
{
return;
}
else
{
locked = true;
//this.clipboardMonitor.ClipboardChanged -= new System.EventHandler<ClipboardAssist.ClipboardChangedEventArgs>(this.clipboardMonitor_ClipboardChanged);
count++;
label1.Text = count.ToString();
removeUnderscore();
//this.clipboardMonitor.ClipboardChanged += new System.EventHandler<ClipboardAssist.ClipboardChangedEventArgs>(this.clipboardMonitor_ClipboardChanged);
locked = false;
}
}
}
我添加了各种调试代码。首先,计数器使我意识到,当我写回剪贴板时,它将再次触发事件。我添加了两个未设置的行,然后设置了事件,因此修改剪贴板不会在事件运行时再次调用该事件。我还添加了代码,如果事件未完成上一次运行(if(lock)
部分),它将阻止事件运行。最终,该事件停止触发(如计数器未递增所示)。事件绝对是问题,我在按钮调用中添加了removeUnderscore()
,并且在事件停止触发后仍然可以正常工作。
我的理论是,由于它调用自己的方法很怪异,所以出现了问题,不再添加该事件。我似乎无法使用锁定对象或布尔值来锁定功能。对可能出什么问题有任何想法吗?
编辑: 我创建了另一个程序,即使只计算剪贴板的更改也是如此。它似乎可以无限期运行,因此问题肯定是由事件本身引起的。我需要一种健壮的方法来在执行时暂停偶数。