【问题标题】:Open Multiple Instances of an App from File Explorer从文件资源管理器打开应用程序的多个实例
【发布时间】:2016-11-18 01:47:46
【问题描述】:

短版: 在 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 的副本,每个文件一个。

【问题讨论】:

    标签: windows registry


    【解决方案1】:

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

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

    将我的类型设置为文档。

    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
    

    做到了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多