我在this thread和this 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键保持比平时更长的时间以避免此错误?