2

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

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

假设我注册了以下命令:

  • “命令 #1” - 触发 'C:\MyProg.exe /cmd1'
  • “命令 #2” - 触发 'C:\MyProg.exe /cmd2'

...(同样)

如何检查是否已经有一个正在运行的MyProg.exe实例并将适当的命令/命令行参数与用户单击的文件名一起传递给它?

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

Delphi 代码片段将不胜感激。

TIA

4

3 回答 3

5

执行此操作的最佳方法实际上是在 exe 的启动代码中。换句话说,让 Explorer 启动 exe 的第二个副本,然后继续检测它是否已经在运行,并让它向正在运行的实例发送消息。

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

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

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

InstanceManager 组件 (C#)

于 2010-01-02T11:38:01.180 回答
2

Here are some examples: http://delphi.about.com/od/adptips2006/qt/activaterunning.htm

于 2010-01-03T10:17:55.037 回答
1

有两种方法可以将项目添加到上下文菜单。

登记处

这种方法很简单,因为它归结为添加一些注册表项。缺点是你不能在其中加入任何逻辑。你可以在这里这里阅读Delphi 中的一个简单示例。如果您使用 DDE 执行菜单项,您将获得更多控制权。请参阅此处以获取 Delphi 示例。如果 DDE 不能解决您的“已经运行”的问题,您可以尝试让您的应用程序通过某种 IPC 方式相互通信。

外壳扩展

此方法工作量较大,但您可以完全从代码中控制上下文菜单。您必须编写一个 DLL,实现IContextMenu(或其他)并使用 Windows 资源管理器注册 dll。你可以在这里阅读。您还可以查看Shell+

于 2010-01-02T11:21:39.113 回答