即使重命名程序文件名,也杀死程序的所有旧实例
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 的互斥锁。
我有一个名为 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 的互斥锁。