与FileSystemWatcher一起使用时,ModifierKeys“粘滞”错误

时间:2013-09-19 19:43:03

标签: c# windows winforms keyboard listener

我在this threadthis thread以及Control.ModifierKeys here和特定于FileSystemWatcher的解决方法here中了解了FileSystemWatcher。但是,当我将两者结合起来时,我遇到了一个奇怪但可解释的错误。至少,我有一个假设。

我的表单使用FileSystemWatcher来检测文件的更改,并在触发时运行某些内容。然而,它运行的东西有点分散注意力和时间浪费,所以如果保存是由 Ctrl + S 完成的,我试图让它跳过运行,即当按住Control键时。

代码是这样的:

private void onFileChanged(object source, FileSystemEventArgs e)
{
    // The try/finally blocks prevent double raising of the changed event
    try
    {
        myFileWatcher.EnableRaisingEvents = false;
        if ((ModifierKeys & Keys.Control) != 0)
            MessageBox.Show("Control held down!");
        else
        {
            MessageBox.Show("Running stuff!");
        }
    }
    finally
    {
        myFileWatcher.EnableRaisingEvents = true;
    }
}

所以这很好,注意两个MessageBox.Show调用替换了块内代码。在正常使用下,它的工作原理。但是,在保存文件和触发onFileChanged之间存在非常小的时间延迟。如果在onFileChanged触发之前释放 Ctrl 键,即如果您非常快速地点击 Ctrl + S ,则会产生非常奇怪的行为。显然,没有检测到Control键,但是从这里开始,即使你按住 Ctrl + S 之后的Control,直到弹出窗口显示,ModifierKeys仍然是0,它会认为 Ctrl 没有按下。然后,如果您在弹出窗口中单击确定时按住 Ctrl ,即使您转到File->保存在文件中,突然ModifierKeys将继续触发Control键。它在看。

有没有办法打败这个错误,或者我必须将其作为不可修复的白垩并告诉我的用户将Control键保持比平时更长的时间以避免此错误?

1 个答案:

答案 0 :(得分:0)

我会尝试设置a global keyboard hook并记录是否仍然按下 Ctrl + S 或者在触发filewatcher事件之前的某个时间内按下了