【问题标题】:Adding a custom "new folder" to windows explorer context menu将自定义“新文件夹”添加到 Windows 资源管理器上下文菜单
【发布时间】:2011-02-02 09:39:58
【问题描述】:

我经常使用当前日期和时间来命名新文件夹,并且我已经制作了一个程序来执行此操作(即它接受一个参数,然后根据当前日期和时间以及参数创建一个新文件夹)。

我想知道如何做到这一点,以便在 Windows 资源管理器的上下文菜单中显示“新日期时间文件夹”(就在“新文件夹”下方),并且它会自动在前面添加日期和时间,允许用户输入名称。它实际上很像标准的“新文件夹”,除了默认名称不是“新文件夹”而是应该是“日期时间”并且默认情况下不应标记文本。

有什么想法吗?谢谢。

【问题讨论】:

    标签: windows contextmenu windows-explorer


    【解决方案1】:

    玩了一会儿后,我想出了一种方法,只需编辑注册表即可添加它的基本版本。它不提示输入名称(它只使用基本的 DD.MM.YYYY HH;MM;SS 格式)并且不进入资源管理器重命名模式:

    Windows Registry Editor Version 5.00
    
    [HKEY_CURRENT_USER\Software\Classes\.NewDirectoryBasedOnDate]
    @="NewDirectoryBasedOnDate"
    
    [HKEY_CURRENT_USER\Software\Classes\.NewDirectoryBasedOnDate\ShellNew]
    "Command"="\"CMD\" /D /E:ON /c for /F \"tokens=1-9 delims=.,\\:/\" %%A IN (\"%%date%%.%%time%%\") DO for /F \"tokens=*\" %%a IN (\"%1\") do md \"%%~dpa\\%%A.%%B.%%C %%D;%%E;%%F\""
    "nullfile"=hex:
    
    [HKEY_CURRENT_USER\Software\Classes\NewDirectoryBasedOnDate]
    "FriendlyTypeName"="Directory Based On Date"
    
    [HKEY_CURRENT_USER\Software\Classes\NewDirectoryBasedOnDate\DefaultIcon]
    @="shell32.dll,3"
    
    [HKEY_CURRENT_USER\Software\Classes\NewDirectoryBasedOnDate\Shell\open]
    "LegacyDisable"=hex:
    
    [HKEY_CURRENT_USER\Software\Classes\NewDirectoryBasedOnDate\Shell\open\command]
    @="."
    

    我只在 WinXP 上对此进行了测试,这有点小技巧(我必须添加伪造的 Shell\open\command 键才能显示新菜单项)

    通过将命令更改为 wscript.exe //nologo "C:\path\to\NewDateDir.wsf" "%1" 并将以下代码保存在 NewDateDir.wsf 中,您将得到以下结果:

    <?xml version="1.0" ?><job><script language="VBScript"><![CDATA[
    
    if WScript.Arguments.Count < 1 then
        MsgBox("Bad parameter!")
        WScript.Quit(1)
    end if
    
    Set FSO=CreateObject("Scripting.FileSystemObject")
    
    Function StrFilter(s,ch,rep)
    StrFilter=Join(Split(s,ch,-1),rep)
    End Function
    
    basedir=FSO.GetParentFolderName(WScript.Arguments(0))
    defname=Date&" "&Time
    defname=StrFilter(defname,"/",".")
    defname=StrFilter(defname,":",";")
    name=InputBox("New folder in "&basedir,"New folder",defname)
    
    if not IsEmpty(name) and Len(name) > 0 then
        FSO.CreateFolder(FSO.BuildPath(basedir,name))
    end if
    ]]></script></job>
    

    即使你决定编写一个 shell 扩展,我认为激活资源管理器重命名模式也会很困难,尤其是在你想要部分选择的情况下。您还必须记住,其他程序可能会实现 shell 上下文菜单,因此您不能使用各种未记录的资源管理器内容。

    【讨论】:

    • 这有点像 hack,但仍然相当令人印象深刻。不错。
    【解决方案2】:

    您必须实现外壳扩展,尤其是上下文菜单。 Here 是一个很好的演练方法。 MSDN here(特别是上下文菜单)和here(一般是 shell 扩展)上还有一些较低级别的文档。对于您的特殊情况,我认为您会在“Directory\Background”键下register您的外壳扩展。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2016-05-10
      • 1970-01-01
      • 2015-07-11
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多