代码之家  ›  专栏  ›  技术社区  ›  John Thomas

在上下文菜单中集成资源管理器,但使用已运行的实例

  •  2
  • John Thomas  · 技术社区  · 16 年前

    我要检查是否存在,如果不存在,请在资源管理器的右键单击(上下文)菜单中添加一些操作。

    除了上述要求(人们可以在网上轻松找到解决方案),我还想再添加一个:

    假设我注册了以下命令:

    • “命令1”-触发器“c:\myprog.exe/cmd1”
    • “命令2”-触发器“c:\myprog.exe/cmd2”

    …(ASO)

    我怎么检查有没有 已经 正在运行的实例 myprog.exe文件 并将适当的命令/命令行参数传递给它 在一起 使用用户单击的文件名?

    (噢,我想用程序已经运行的实例来完成我的任务,而不是打开一个新的实例)

    一个Delphi代码片段会很受欢迎。

    蒂亚

    3 回复  |  直到 16 年前
        1
  •  1
  •   Lars Truijens    16 年前

    向上下文菜单添加项有两种方法。

    登记处

    这个方法很简单,因为它可以添加一些注册表项。缺点是你不能把任何逻辑放进去。你可以读到它 here here Delphi中的一个简单示例。如果使用DDE执行菜单项,则可以获得更多的控制权。见 here 例如Delphi。如果DDE不能解决你“已经运行”的问题,你可以尝试让你的应用程序通过某种IPC方式相互通信。

    外壳扩展

    这个方法有点复杂,但是您可以从代码中完全控制上下文菜单。你必须写一个dll,实现 IContextMenu (或其他)并在Windows资源管理器中注册DLL。你可以读到它 here . 你也可以退房 Shell+ .

        2
  •  5
  •   Josh    16 年前

    实现这一点的最佳方法实际上是在exe的启动代码中。换句话说,让资源管理器启动exe的第二个副本,然后继续检测它是否已经在运行,并让它向正在运行的实例发送消息。

    就我个人而言,我几乎没有使用Delphi的经验,但是我在.NET应用程序中这样做的方式是使用互斥和进程间通信通道。

    一般的想法是应用程序的第一个实例将启动,并开始在IPC通道上侦听。它还将创建一个命名的进程间互斥体。当第二个实例启动时,它将无法创建同名的互斥体,这意味着前一个实例正在运行并在IPC通道上侦听调用。然后,第二个实例通过IPC将命令行参数发送给第一个实例,第一个实例对它们执行了操作。然后,第二个实例退出而不显示任何UI。

    我已经上传了这个组件的代码(c),链接如下。我不相信它有任何外部依赖性,我也不知道Delphi中等效的通信机制是什么——但希望这能给你一些想法。

    InstanceManager Component (C#)

        3
  •  2
  •   Torbins    16 年前
    推荐文章