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

标签 windows delphi winapi explorer

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

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

假设我注册了以下命令:

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

...(同样)

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

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

Delphi 代码片段将不胜感激。

TIA

最佳答案

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

就个人而言,我几乎没有使用 Delphi 的经验,但我在 .NET 应用程序中执行此操作的方式是使用互斥锁和进程间通信 channel 。

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

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

InstanceManager Component (C#)

关于windows - 资源管理器集成在上下文菜单中,但使用已经运行的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1991255/

相关文章:

javascript - 由于错误 80020101 (v1.5.3),GMLib 无法完成操作

delphi - 如何更改spvoice语言

winapi - 如何使另一个应用程序的窗口透明?

c - 内存分配和释放

java - 从 Java Applet 上的控件捕获文本

php - Windows 上的 PHP 7.1 x64 NTS 缺少 MongoDB 库

windows - InnoSetup 在 Mac Parallels 上安装的 Win XP 上找不到 'My Documents'

C# - 如何在 Windows 64 位上获取程序文件 (x86)

windows - 禁用 Apache 中 *nocache* 文件的缓存

delphi - Deplhi 5 中的编译器指令 SETPEFlags