在Windows中识别正在运行的程序

问题描述:

我有以下情况,我需要在执行程序之前检测窗口中运行的特定程序,例如我的程序需要知道LogMeIn是否已安装并正在运行,已经使用了一些方法,如使用psapi.dll枚举进程,但我认为进程名称可能在安装和配置阶段发生变化,所以我不知道如何确保始终独立于此找到进程。我正在使用一些基于以下代码片段的测试:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx在Windows中识别正在运行的程序

另一种方法是使用注册表代码,但我检测到它也可能被修改,并且不是标准的。

+0

'EnumProcesses'也是我将采用的方法。我看不出有什么问题。如果程序名称改变了,它不再是同一个程序。对此你没有太多可以做的。另一种方法是检查文件系统/注册表。再一次,这些可能也会改变。 – 2012-03-27 16:06:41

+0

*进程名称*是指* .exe *的名称,而不是应用程序名称? – hmjd 2012-03-27 16:09:55

+0

我使用应用程序itsef的名称。并且这个想法总是检测到logMein和其他程序运行无关紧要,如果程序正在运行时使用更改的名称或更改注册表键等。我试图确定最标准的方法来获得正确的PID关联,然后相应地采取行动。 – willyMon 2012-03-27 16:21:30

如果你想跟踪的程序是窗口化的(所以窗口显示),窗口标题是你预测的东西。您可以使用EnumWindows功能。如果标题发生变化,但仍然有一些词在不同的运行过程中是相同的,则可以使用正则表达式来查看名称是否符合您的要求。 例子:

LogMeIn的运行...

2012-03-27:LogMeIn的

这两个字符串共享一个共同的,明确的名称,这样你就可以告诉大家,将是你的寻找。 您可以将此推理应用于EnumProcess方法

+0

是的,这在窗口化时可能很有用,因此下一步就是找到识别未加载程序的方法。 – willyMon 2012-03-27 16:23:12

+0

您知道哪些信息可以帮助您识别该程序?可执行文件名称?安装路径?一个注册表项,给你的路径? – grifos 2012-03-27 16:58:51

+0

如果您枚举的进程和要查找的可执行文件的名称有所不同,但您始终知道应该在何处安装它,则可以使用GetModuleFileNameEx函数获取启动进程的可执行文件的路径(名称)。 – grifos 2012-03-27 17:04:18