检查用户是否正在重命名文件资源管理器中的文件 C#

Check if a User is renaming a file in File Explorer at the Moment C#

我正在编写一个 C# 程序来侦听在文件资源管理器中按下的 Space。当按下 space 时,我创建了一个 WPF window,它在 WPF Window.

中显示了选定的文件

唯一的问题是,当有人编辑文件名并按 space 以在文件名中显示白色 space 时,也会调用此文件预览。

有没有办法检测用户此时是否正在重命名文件?


附加信息:

我知道我可以听 F2,但也可以通过用鼠标左键单击两次或右键单击文件并选择重命名来开始重命名文件。所以这不是一个好的解决方案。

技术信息(如果需要):

我使用 GetForegroundWindow 检查前景中的 Window 是否是资源管理器 window。然后我使用 Hooks 在前台的 explorer 进程中监听按下的键。

要获取所选项目,我使用 SHDocVw 和 Shell32

                    Shell32.FolderItems selectedItems = ((Shell32.IShellFolderViewDual2) window.Document).SelectedItems();

要检测文件重命名,请检查 FileSystemWatcher.Changed 事件。这是从 MSDN 中获取的示例代码。 MSDN FileSystemWatcher Example

我稍微修改了代码。我已经验证了代码。它会在文件重命名时发出通知。

using System;
using System.IO;
using System.Security.Permissions;

namespace FileWatcher
{
    class Program
    {
        static void Main(string[] args)
        {
            Run();
        }

        [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
        public static void Run()
        {
            // Create a new FileSystemWatcher and set its properties.
            FileSystemWatcher watcher = new FileSystemWatcher();

            watcher.Path = @"c:\temp"; //Specify the directory name where file resides

            /* Watch for changes in LastAccess and LastWrite times, and
               the renaming of files or directories. */

            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
               | NotifyFilters.FileName | NotifyFilters.DirectoryName;

            // Only watch text files.
            watcher.Filter = "*.txt";

            // Add event handlers.
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnChanged);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);

            // Begin watching.
            watcher.EnableRaisingEvents = true;

            // Wait for the user to quit the program.
            Console.WriteLine("Press \'q\' to quit the sample.");
            while (Console.Read() != 'q') ;
        }

        // Define the event handlers. 
        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            // Specify what is done when a file is changed, created, or deleted.
            Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
        }

        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            // Specify what is done when a file is renamed.
            Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
        }
    }
}

Your file navigation enhancement should not risk interfering with the behaviour currently present in Windows Explorer.

因此:

Ctrl+Space

使用 Ctrl+Space 等新命令将不会在文件重命名操作期间触发,加上您的应用程序将使用 标准 在 Windows OS 用户命令 (有一点香料).

  • Ctrl+Space 是我们开发人员的 IntelliSense 命令,因此它是人们使用的自然命令"more info"/"help me out".

我希望你有一个非常特别的文件预览。在过去的 2 年里,有很多情况下 PITA 不是一种乐趣:(
http://support.microsoft.com/kb/983097
http://support.microsoft.com/kb/2257542