Определение запущенной программы в Windows

У меня есть следующий сценарий: мне нужно обнаружить конкретную программу, работающую в Windows, прежде чем я смогу выполнить свою программу, например, моя программа должна знать, действительно ли LogMeIn установлен и запущен, чтобы продолжить, я использовал некоторые подходы, такие как перечисление процессов с использованием psapi .dll, но я думаю, что имя процесса могло измениться на этапе установки и настройки, поэтому я не знаю, как сделать так, чтобы я всегда мог найти процесс независимо от этого. Я использую некоторые тесты, основанные на следующих фрагментах кода: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx

Другой подход заключается в использовании кода реестра, но я обнаружил, что его тоже можно изменить, и он не является стандартным.


person willyMon    schedule 27.03.2012    source источник
comment
EnumProcesses - это подход, который я бы тоже выбрал. Я не вижу, в чем проблема. Если имя программы изменилось, это уже не та же самая программа. Вы мало что можете с этим поделать. Альтернативой является проверка файловой системы/реестра. Опять же, они тоже могут измениться.   -  person Mike Kwan    schedule 27.03.2012
comment
Под имя процесса вы имеете в виду имя .exe, а не имя приложения?   -  person hmjd    schedule 27.03.2012
comment
Я использую имя самого приложения. и идея заключается в том, чтобы всегда обнаруживать, что logMein и другие работают, независимо от того, работает ли программа с измененным именем или измененным ключом реестра и т. д. Я пытаюсь определить наиболее стандартный подход, чтобы получить правильный связанный PID и действовать соответственно.   -  person willyMon    schedule 27.03.2012
comment
Я согласен; личность размыта. Является ли Notepad.EXE из Windows 7 таким же, как в Windows 3.11; если нет, то какие версии равны? Кроме того, ваш подход к реестру ошибочно предполагает, что работающая программа должна иметь запись в реестре.   -  person MSalters    schedule 27.03.2012
comment
Если EXE не найден, то продолжайте и поднимите ложный отрицательный результат. Перед запуском этой программы необходимо запустить LogMeIn. Может быть, дать им кнопку «Продолжить в любом случае».   -  person Raymond Chen    schedule 28.03.2012


Ответы (1)


Если программа, которую вы хотите отслеживать, является оконной (поэтому отображается окно), а заголовок окна является тем, что вы предсказываете. Вы можете использовать EnumWindows< /а> функция. Если заголовок меняется, но все еще содержит несколько слов, одинаковых для разных прогонов, вы можете использовать регулярное выражение, чтобы увидеть, соответствует ли имя тому, что вы хотите. Пример:

ЛогМеИн работает...

2012-03-27: ЛогМайн

Эти две строки имеют общее и явное имя, поэтому вы можете сказать, что это то, что вы ищете. Вы можете применить это рассуждение к методу EnumProcess.

person grifos    schedule 27.03.2012
comment
да, это может быть полезно, когда работает в оконном режиме, поэтому следующим шагом будет получение подхода для идентификации не оконных программ. - person willyMon; 27.03.2012
comment
Какую информацию вы знаете, что может помочь вам идентифицировать программу? Имя исполняемого файла? Путь установки? Запись реестра, которая дает вам путь? - person grifos; 27.03.2012
comment
Если вы перечислили процессы и имя исполняемого файла, который вы ищете, различаются, но вы всегда знаете, где он должен быть установлен, вы можете использовать функцию GetModuleFileNameEx, чтобы получить путь (с именем) исполняемого файла, который запустил процесс. - person grifos; 27.03.2012