首页 > 解决方案 > 剪贴板监控事件停止触发

问题描述

我有一些软件可以处理 Windows 剪贴板上的文本。具体来说,它将删除_剪贴板文本前面的下划线(并返回字符),然后检查剩余文本是否为 URL。如果是,则将不带下划线的 URL 存储在剪贴板上,否则保留原始文本。为了监视剪贴板的更改,我使用了 DBKK 提供的这个问题的答案中的代码。它工作正常,但会在 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()了一个按钮调用,当事件停止触发时它仍然可以正常工作。

我的理论是,由于它可以调用自己的奇怪方式,出现问题并且不再添加事件。我似乎无法使用锁定对象或布尔值锁定函数。关于可能出现问题的任何想法?

编辑:我创建了另一个程序,即使它只计算剪贴板更改。它似乎无限期地运行良好,所以问题肯定是由调用它自己的事件引起的。我需要一种强大的方法来在它执行时暂停它。

标签: c#windowsclipboard

解决方案


推荐阅读