【发布时间】:2013-09-25 01:30:00
【问题描述】:
我在 this thread 和 this thread 和 FileSystemWatcher here 中了解了 Control.ModifierKeys 以及 FileSystemWatcher 特定的解决方法 here。但是,当我将两者结合起来时,我遇到了一个奇怪但可以解释的错误。至少,我有一个假设。
我的表单使用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 的同时单击弹出窗口中的 OK,即使您转到 File->Save 在它正在观看的文件中,ModifierKeys 也会突然触发 Control 键。
有没有办法解决这个错误,或者我是否必须将它标记为无法修复并告诉我的用户按住 Control 键的时间比他们平时更长的时间才能避免这个错误?
【问题讨论】:
-
您的意思是用户在另一个应用程序(如记事本)中编辑文件并按 Ctrl-S 保存?
-
是的,就是这样。应用程序处理正在观看的文件,然后运行几个进程,这些进程会弹出窗口,每个进程需要几秒钟才能完成,因此,如果您正在编辑并不停地按 Ctrl+S 保存以避免丢失工作,您可以想象一下这会很快变得烦人。
-
@KevinT 不太明白您为什么要检测
Ctrl,如果您想确定应用了什么样的更改,您可能需要查看e.ChangeType在FileSystemEventHandler -
在编辑文件时,您经常按 Ctrl+S,这是一种保存更改并避免丢失工作的方法。每次这样做都重新处理文件会适得其反。更改类型无济于事,因为我试图检测文件是通过键盘快捷键保存还是通过文件菜单保存。
-
@KevinT 您尝试通过
File menu检测保存的内容是什么?顺便说一句,我必须补充一点,我们还有 1 种方式 来保存文件,我经常使用这种方式,这只是 先关闭编辑器窗口然后在出现要求保存更改以接受保存的对话框上单击确定
标签: c# windows winforms keyboard listener