即使重命名程序文件名,也杀死程序的所有旧实例

Killing all older instances of a program even if program filename is renamed

我有一个名为 Test 的项目,它是一个带有 1 个按钮的表单。我想做的是当我点击按钮时它会杀死它的所有旧实例。

所以这就是我所做的:

Private Sub removeOldInstances()
        'gets all processes with the same name as the project.
        Dim oldProcess() As Process = Process.GetProcessesByName("Test")
        Dim currentProcessId As Integer = Process.GetCurrentProcess.Id
        For Each p As Process In oldProcess
            If p.Id <> currentProcessId Then
                p.Kill()
            End If
        Next
    End Sub

然后我在点击时调用了按钮。

所以我测试了它,它工作正常。但是,当我将 .exe 重命名为其他内容并尝试 运行 时,问题就出现了。所以假设我将它重命名为 Test1 而不是 Test。如果我 运行 它的 2 个实例,如果我单击其中一个按钮,它不会杀死它的旧实例。这可能是因为在我的 removeOldInstances 方法中,它通过名称 "Test".

获取进程

我注意到,如果您查看程序的属性,在详细信息选项卡下有一个名为 original filename 的东西。我在想也许我可以使用它来获取所有进程,但我该怎么做呢?

如果有人能给出提示或其他方法,我们将不胜感激。

原始文件名是 "VerInfo" 属性,在处理过程中不会作为 属性 出现。您可以在构建应用程序时或使用 ResHack 之类的东西时将其设置为任何您想要的东西。不过,您需要在磁盘上找到该文件才能查询该信息。

考虑使用诸如命名互斥体之类的东西,其中包含您的应用程序在启动时创建的进程 ID。例如在应用程序启动时,使用 "myTestAppNamePid1234" 创建一个命名的互斥锁,并在您的进程检查循环中尝试打开具有您正在循环的名称和 PID 的互斥锁。