从文件资源管理器

时间:2016-07-15 00:26:04

标签: windows registry

简短版本 在Windows上,如果我在文件资源管理器中选择几个.txt文件,然后右键单击其中一个选定文件并选择"打开"从弹出菜单中,将打开所有选定的文件,每个文件都在一个单独的记事本实例中。

我希望文件/编辑器具有相同的行为:选择多个输出文件,右键单击一个,选择打开: - >打开所有文件,每个文件都在我们编辑器的实例中。

我有基本的点击打开工作(对于单个文件,双击在我们的编辑器中打开文件,右击并打开也是如此)。

详情

我们有一个启动器(FuBarStudioLauncher.exe)更新然后启动我们的编辑器工具(FuBarStudio.exe),它生成带有自定义扩展的资源文件(samplefile.fbr)

如果从命令行运行,则可以启动编辑器,打开特定资源:

C:\path_to_my_exe\FuBarStudio.exe" -ide samplefile.fbr 

我有一个Windows注册表项设置,以便当我双击* .fbr资源文件,或右键单击并从弹出菜单中选择“打开”时,启动器运行,将给定资源传递给编辑器。

相关注册表项:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.fbr]
@="FuBar.Place"

[HKEY_CLASSES_ROOT\.fbr\FuBar.Place]

[HKEY_CLASSES_ROOT\.fbr\FuBar.Place\ShellNew]

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\FuBar.Place]
@="FuBar Place"

[HKEY_CLASSES_ROOT\FuBar.Place\shell]

[HKEY_CLASSES_ROOT\FuBar.Place\shell\Open]
@="Open"

[HKEY_CLASSES_ROOT\FuBar.Place\shell\Open\command]
@="\"C:\\path_to_my_exe\\FuBarStudioLauncher.exe\" -ide \"%1\""

所有这一切都适用于单个文件。

如果我选择了多个.fbr文件,然后右键单击其中一个选定文件并选择"打开",我将只打开一个FuBar Studio实例。

我想打开一个FuBar Studio副本,每个文件一个。

1 个答案:

答案 0 :(得分:0)

所以在一些帮助下我得到了一个有用的答案。

1)我在这里阅读了MultiSelectModel的使用方法: https://msdn.microsoft.com/en-us/library/windows/desktop/hh127436(v=vs.85).aspx

将我的类型设置为Document。

2)我创建了一个批处理脚本作为中介,所以我可以更好地看到发生了什么:

[HKEY_CLASSES_ROOT\FuBar.Place\shell\Open\command]
@="\"C:\\path_to_my_exe\\launcher.bat\" \"%1\""

使用此脚本,将内容写入tmp文件:

echo "interesting things" >> logs.txt

并使用超时强制暂停/减速:

timeout 10

使用" echo"等等我意识到MultiSelectModel是设置为Document还是Player,当我选择多个文件并右键单击" Open"时,Windows正在执行以下业务:

HKEY_CLASSES_ROOT\FuBar.Place\shell\Open\command

每个选定的文件一次。

我找不到强制Windows调用命令一次的方法,将所有文件作为参数传递给命令。

3)通过尝试除我自己以外的其他程序,并使用脚本+超时给我一个错误喷出的命令shell来查看,我意识到如果另一个实例正在运行,我的特定程序FuBarStudioLauncher.exe总是会失败。

所以这就是我所拥有的:

  • Windows将为每个输入文件运行一个<something>实例。
  • <something>无法成为我的FuBarStudioLauncher.exe,因为在运行之后,下一个N将失败。

所以我需要一个中间脚本来执行某种关键部分锁定: - 抓住锁。 - 运行启动器完成。 - 释放锁定。

StackOverflow的万岁:

Semaphore for CMD instances working in Parallel

使用此作为输入,我的最终产品:

:lockedAppend
2>nul (
    >>%~dp0launcher_script_lockfile.txt (
        REM Do any amount of processing within this block.
        REM All stdout will safely be appended to the queue
        REM You could even call out to a subroutine, or another batch file

        %~dp0FuBarStudioLauncher.exe -ide "%1"
        REM The CALL below ensures that the block exits with ERRORLEVEL 0 - success
        (call )
    )
) || goto :lockedAppend

那就做到了!

相关问题