有关通过上下文菜单打开多个文件的更多信息

时间:2015-08-20 00:00:11

标签: registry contextmenu multiple-files dde

StackOverflow线程之前已经处理过这个主题,但总是在编写代码的上下文中。我只是想编辑注册表。

我正在尝试在MP4文件类型上创建上下文菜单项。有时候我需要将声音去掉MP3,用Audacity编辑它,然后把它放回到MP4中。要做到这一点,我正在使用DVDVideoSoft的FreeVideoToMP3Converter.exe。这个应用程序可以一次转换多个MP4。我可以将它们拖放到窗口上,让它们全部打开;执行具有多个文件名的命令行会使用一个实例;并使用SendTo在单个实例中打开多个文件。我似乎无法做的是编辑MP4文件类型的上下文菜单,以便我可以选择多个MP4文件并在单个实例中打开它们。对StackOverflow和网络的研究表明了三种方法:

  1. 在动词上使用MultiSelectModel = Player
  2. 使用DDE
  3. 编写contextMenuHandler
  4. 3不适用,1没有产生所需的行为。 2,我猜测诀窍是找出应用程序的名称。这就是我目前所拥有的(在Windows 10中):

    Windows Registry Editor Version 5.00
    
    [HKEY_USERS\S-1-5-21-3229476284-161306217-3300585696-1001\SOFTWARE\Classes\AppX6eg8h5sxqq90pv53845wmnbewywdqq5h\Shell\ConverttoMP3]
    @="Convert to MP3"
    "MultiSelectModel"="Player"
    
    [HKEY_USERS\S-1-5-21-3229476284-161306217-3300585696-1001\SOFTWARE\Classes\AppX6eg8h5sxqq90pv53845wmnbewywdqq5h\Shell\ConverttoMP3\command]
    @="\"C:\\Program Files (x86)\\DVDVideoSoft\\Free Video to MP3 Converter\\FreeVideoToMP3Converter.exe\" \"%1\""
    
    [HKEY_USERS\S-1-5-21-3229476284-161306217-3300585696-1001\SOFTWARE\Classes\AppX6eg8h5sxqq90pv53845wmnbewywdqq5h\Shell\ConverttoMP3\ddeexec]
    @="Open(\"%1\")"
    
    [HKEY_USERS\S-1-5-21-3229476284-161306217-3300585696-1001\SOFTWARE\Classes\AppX6eg8h5sxqq90pv53845wmnbewywdqq5h\Shell\ConverttoMP3\ddeexec\application]
    @="FreeVideoToMP3Converter"
    
    [HKEY_USERS\S-1-5-21-3229476284-161306217-3300585696-1001\SOFTWARE\Classes\AppX6eg8h5sxqq90pv53845wmnbewywdqq5h\Shell\ConverttoMP3\ddeexec\topic]
    @="system"
    

    在两个选定的MP4上使用上下文菜单会导致应用程序打开其中一个,并且另一个消息框会显示“将命令发送到程序时出现问题”。首先猜测是因为我没有得到正确的DDE应用程序名称。

    当然,我可以使用SendTo并获得所需的结果(并且在我等待响应的同时也会这样做),但我也希望在上下文菜单中正确使用它。所以我的问题是双重的,既具体又一般。首先,我如何确定DDE将用作应用程序名称,以便我可以正确指定它?例如,Textpad的DDE应用程序名称是“Textpad.7”,这是一个在注册表中没有出现的字符串。怎么会知道的?有一篇文章说它通常是文件名中没有“.exe”,但这就是我上面提到的,而且,不,这次不是。第二,如果我走错了路,需要朝另一个方向前进,请指明方向。

    关于这个主题的先前StackOverflow线程说“它不会像你希望的那样容易”,但我不禁注意到SendTo做到了,甚至没有“%1”。那么SendTo知道我不知道什么呢?

1 个答案:

答案 0 :(得分:0)

在Windows XP上制作:

也可以在更高版本的Windows上使用。

Windows为每个选定的文件执行一次上下文菜单项命令。 我通过编写.vbs脚本来连接来自其所有实例的参数,然后只调用一次应用程序,并将所有文件路径作为参数来解决这个问题。

myscript.vbs:

set WshShell = WScript.CreateObject("WScript.Shell")
set WMIService = GetObject("winmgmts:root\cimv2")

dim FirstCommandLine, CommandLineParts, AllFiles

set AllInstances1 = WMIService.ExecQuery("Select CommandLine FROM Win32_Process WHERE CommandLine LIKE '%" & wscript.scriptname & "%'")
For Each item In AllInstances1
    FirstCommandLine = item.CommandLine 'Get the command line of the first instance of this script
    exit for
Next

if InStr(FirstCommandLine,WScript.Arguments.Unnamed(0)) then 'This is the first instance
    WScript.Sleep 400
    'Update instance list to check if other instances appeared
    set AllInstances2 = WMIService.ExecQuery("Select CommandLine FROM Win32_Process WHERE CommandLine LIKE '%" & wscript.scriptname & "%'")
    while AllInstances2.count > AllInstances1.count 'While other instances keep appearing
        WScript.Sleep 400
        'Keep updating instance list
        set AllInstances1 = AllInstances2
        set AllInstances2 = WMIService.ExecQuery("Select CommandLine FROM Win32_Process WHERE CommandLine LIKE '%" & wscript.scriptname & "%'")
    wend
    For Each item In AllInstances2
        CommandLineParts = Split(item.CommandLine,"""")
        AllFiles = AllFiles & """" & CommandLineParts(UBound(CommandLineParts)-1) & """ " 'Get all the file paths
    Next
    WshShell.Run("""Path\to your\application.exe"" /switches" & AllFiles)
else 'This is not the first instance. Before exiting, sleep for a moment for the first one to detect.
    WScript.Sleep 4000
end if

要使用它,您需要使用以下命令在HKEY_CLASSES_ROOT中创建正确的注册表项:

wscript //nologo "Full Path\myscript.vbs" "%1"