StackOverflow线程之前已经处理过这个主题,但总是在编写代码的上下文中。我只是想编辑注册表。
我正在尝试在MP4文件类型上创建上下文菜单项。有时候我需要将声音去掉MP3,用Audacity编辑它,然后把它放回到MP4中。要做到这一点,我正在使用DVDVideoSoft的FreeVideoToMP3Converter.exe。这个应用程序可以一次转换多个MP4。我可以将它们拖放到窗口上,让它们全部打开;执行具有多个文件名的命令行会使用一个实例;并使用SendTo在单个实例中打开多个文件。我似乎无法做的是编辑MP4文件类型的上下文菜单,以便我可以选择多个MP4文件并在单个实例中打开它们。对StackOverflow和网络的研究表明了三种方法:
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知道我不知道什么呢?
答案 0 :(得分:0)
也可以在更高版本的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"