Первое и самое важное, что не все приложения сохраняют свою версию где-то в системе.Если честно, лишь немногие из них делают это.Место, куда вы должны обратиться, - это реестр Windows.Большинство установленных приложений помещают свои установочные данные в следующее место:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Однако это не так просто - в 64-битной Windows 32-битные (x86) приложения сохраняют свои установочные данные в другой ключ, а именно:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
В этих ключах есть много клавиш, некоторые из них имеют «легко читаемое» имя, например Google Chrome
, некоторые из них имеют имена, такие как {63E5CDBF-8214-4F03-84F8-CD3CE48639AD}
.Вы должны разобрать все эти ключи в вашем приложении и начать искать имена приложений.Обычно они имеют значение DisplayName
, но это не всегда так.Версия приложения обычно имеет значение DisplayVersion
, но некоторые установщики используют другие значения, например Inno Setup: Setup Version
, ... У некоторых приложений их версия написана на их имени, поэтому возможно, что версия приложения ужев значении DisplayName
.
Примечание: Нелегко проанализировать все эти ключи и значения реестра и «выбрать» правильные значения.Не все установщики сохраняют данные приложения в эти ключи, некоторые из них не сохраняют версию приложения там, и так далее.Однако обычно приложение использует эти ключи реестра.[Источник: StackOverflow: обнаружение установленных программ через реестр , просмотр моего собственного реестра]
Хорошо, теперь, когда вы знаете, куда вам следует обратиться, вы должны запрограммировать все это на C #.Я не буду писать приложение для вас, но я скажу вам, какие классы вы должны использовать и как.Во-первых, вам нужно это:
using System;
using Microsoft.Win32;
Чтобы добраться до вашего HKEY_LOCAL_MACHINE
, создайте RegistryKey
следующим образом:
RegistryKey baseRegistryKey = Registry.LocalMachine;
Теперь вам нужно определить подключи:
string subKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
// or "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
Теперь вам нужно перейти к подразделу, поэтому создайте новый RegistryKey
:
RegistryKey uninstallKey = baseRegistryKey.OpenSubKey(subKey);
Теперь вам нужно пройти через все подключи, которые есть, поэтому сначала мы получимимена всех подразделов:
string[] allApplications = uninstallKey.GetSubKeyNames();
Теперь вы должны пройти через все подразделы самостоятельно , один за другим, создав новый раздел реестра (вам не нужно, ноЯ сделаю это):
RegistryKey appKey = baseRegistryKey.OpenSubKey(subKey + "\\" + applicationSubKeyName);
где applicationSubKeyName
- имя подключа, который вы проверяете в данный момент.Я рекомендую заявление foreach
, которое вам поможет (однако вы уже должны иметь некоторый опыт работы с C #, я не буду рассказывать вам, как использовать foreach
здесь).
Теперь проверьте имя приложения исравните его с именем нужного приложения (вы не можете полагаться на имя подключа, потому что, как я уже сказал, они могут быть вызваны, например, {63E5CDBF-8214-4F03-84F8-CD3CE48639AD}
, поэтому вы должны проверить имя здесь):
string appName = (string)appKey.GetValue("DisplayName");
Если это правильное приложение (вы должны проверить его самостоятельно), найдите версию:
string appVersion = (string)appKey.GetValue("DisplayVersion");
Et voilà, у вас есть версия.По крайней мере, вероятность того, что у вас будет 60-80% ...
Помните! Если какой-либо ключ или значение не существует, метод возвращает null
.Не забывайте проверять, является ли возвращаемое значение нулевым каждый раз, иначе ваше приложение будет аварийно завершать работу.
Где найти больше? Проект кода: чтение, запись и удаление из реестра с помощью C #
Я действительно надеюсь, что помог вам.А если вы хотели узнать что-то еще, а я не поняла ваш вопрос, то, пожалуйста, спросите лучше в следующий раз.:)