【问题标题】:Check if a User is renaming a file in File Explorer at the Moment C#检查用户是否正在文件资源管理器中重命名文件 C#
【发布时间】:2015-01-24 18:53:24
【问题描述】:

我正在编写一个 C# 程序,它侦听文件资源管理器中按下的空格。当按下空格时,我创建一个 WPF 窗口,在 WPF 窗口中显示所选文件。

唯一的问题是,当有人在编辑文件名并为文件名中的空格按下空格时,也会调用此文件 Preview。

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


附加信息:

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

技术信息(如果需要):

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

要获得选定的项目,我使用 SHDocVw 和 Shell32

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

【问题讨论】:

  • 澄清一下,您正在尝试构建一个类似于 Mac OS X 上的 Finder 的 windows 文件预览功能,即在选择文件时按空格会弹出预览窗口?
  • 是的,这正是我所做/所做的。
  • Explorer 已经有一个使用 ALT+P 切换的预览窗格。您是否尝试修改快捷方式的行为?
  • 一个想法:你到底是如何与按键挂钩的?全局挂钩?你能分享那个代码吗?对于每次击键通知,您应该获得每次击键发生的控件的窗口句柄 (HWND / IntPtr)。您必须检查每个此类 HWND 的窗口类并验证它属于列表视图(资源管理器视图)而不是文本框(文件重命名框)。
  • SetWindowsHookExMSDN 文档中,您似乎无法获得使用 @ 时生成事件的焦点子控件的 HWND 987654329@。也许WH_CALLWNDPROCWH_CALLWNDPROCRET 会在您的场景中为您提供更好的服务。但是,请查看 CodeProject 上的这篇文章,它应该提供一些关于如何使用当前代码解决问题的指导:Control in Focus in Other Processes

标签: c# hook explorer shell32


【解决方案1】:

您的文件导航增强功能不应有干扰 Windows 资源管理器中当前存在的行为。

因此:

Ctrl+空格

在文件重命名操作期间不会触发诸如 Ctrl+Space 之类的新命令,而且您的应用程序将使用 标准 融入 Windows 操作系统用户命令(带有一点香料)

  • Ctrl+Space 是我们开发人员的 IntelliSense 命令,因此它是人们用于“更多信息”/“帮助我”的自然命令。

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

【讨论】:

  • 嘿@Jeremy,我也在考虑这个问题,但首先我想看看空间是否真的不可能。看起来如果没有其他解决方案,我将实施 Ctrl + Space。我希望文件预览不会太糟糕,当我完成它时,我会发布源代码。我只是在预览 Microsoft Office 文档时遇到问题。最好的问候和感谢您的评论。
  • 我上一份工作中的 Excel 预览以及我过去使用过的许多实用程序导致了很多问题 - 真的很深奥。这就是我加入的原因,我希望你的项目是成功的(我会关注你关于这个主题的问题)。由于这是您的第一个赏金,请不要忘记通过检查答案勾号下方的赏金来奖励它。干杯
【解决方案2】:

要检测文件重命名,请检查 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);
        }
    }
}

【讨论】:

  • 事件Renamed发生在之后?我读它的方式是,当文件被重命名时,OP 想要捕获它,而不是之后。
  • AFAIK,重命名事件仅在文件重命名后发生。重命名文件时不会发生这种情况。请使用代码进行确认。
  • 嘿@Co​​der,感谢您的尝试,但Renamed事件仅在文件重命名后发生,因此不适用于我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多