【WPF】パソコンにインストールされてるソフトをチェックしてみる

2017年11月26日C#,開発

おはようございます。

業務アプリなんかでは、
データベースなど本体の他にアプリケーションの動作に必要なものがあったりします。

そういったものがインストールされているかどうか、プログラムでチェックする処理を書いてみました。

プログラムは一応前回のものを流用します。

スポンサーリンク

クラスの追加

アプリケーション情報クラス

クラスの追加

ソリューション・エクスプローラーからプロジェクトを右クリックし、「追加」>「クラス」を選択します。

名前を入力して「追加」ボタンをクリックします。

名前を入力

プログラムは次のようにします。

UninstallApp.cs

	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;
	using System.Threading.Tasks;
	
	namespace WpfApp1
	{
		/// <summary>
		/// アンインストールアプリケーション.
		/// </summary>
		public class UninstallApp
		{
			/// <summary>
			/// 表示名
			/// </summary>
			public String DisplayName { set; get; }
	
			/// <summary>
			/// 表示バージョン
			/// </summary>
			public String DisplayVersion { set; get; }
	
			/// <summary>
			/// インストール日次
			/// </summary>
			public String InstallDate { set; get; }
			
			/// <summary>
			/// 発行元
			/// </summary>
			public String Publisher { set; get; }
		}
	}

 

レジストリチェッククラス

先程と同様、ソリューション・エクスプローラーからクラスを追加します。

名前の入力

RegistryUtil.cs

	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;
	using System.Threading.Tasks;
	
	using Microsoft.Win32;
	
	namespace WpfApp1
	{
		public static class RegistryUtil
		{
	
			/// <summary>
			/// 対象のアプリケーションがインストールされているかどうかを返します.
			/// </summary>
			/// <param name="appName"></param>
			/// <returns></returns>
			public static Boolean isInstalled(String appName)
			{
	
				List<UninstallApp> list = getUninstallAppList();
				var result = list.Where(x => x.DisplayName.IndexOf(appName) > -1).ToList();
				if (result.Count > 0)
				{
					return true;
				}
	
				return false;
			}
	
			/// <summary>
			/// アンインストールアプリケーションの一覧を作成します.
			/// </summary>
			/// <returns></returns>
			public static List<UninstallApp> getUninstallAppList()
			{
				String uninstallPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
				RegistryKey regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(uninstallPath, false);
				List<UninstallApp> list = new List<UninstallApp>();
				if (regKey != null)
				{
					foreach (string subKey in regKey.GetSubKeyNames())
					{
						UninstallApp ap = new UninstallApp();
						RegistryKey appkey = Registry.LocalMachine.OpenSubKey(uninstallPath + "\\" + subKey, false);
						// 表示名
						String displayName = GetValue(appkey, "DisplayName");
						ap.DisplayName = displayName != "" ? displayName : subKey;
						// バージョン
						ap.DisplayVersion = GetValue(appkey, "DisplayVersion");
						// インストール日時
						ap.InstallDate = GetValue(appkey, "InstallDate");
						// 発行元
						ap.Publisher = GetValue(appkey, "Publisher");
						list.Add(ap);
					}
				}
				return list;
			}
	
			/// <summary>
			/// レジストリキーから指定した名前のデータを取得します.
			/// </summary>
			/// <param name="key"></param>
			/// <param name="name"></param>
			/// <returns></returns>
			private static String GetValue(RegistryKey key, String name)
			{
				var value = key.GetValue(name);
				if (value != null)
				{
					return value.ToString();
				}
				return "";
			}
		}
	}

プログラムの修正

起動時にチェックするように修正

			public MainWindow()
			{
	
				InitializeComponent();
	
				if (!RegistryUtil.isInstalled("Oracle"))
				{
					MessageBox.Show("Oracleがインストールされていません。", "起動時チェック");
					this.Close();
				}
				
				.
				.
				.
				省略
			}

 

起動してみる

アラートメッセージ

起動時にチェックが実施され、アラートメッセージが表示されました。

まとめ

レジストリを参照するので、他にもいろいろと応用がききそうですね。

また、必要なアプリがインストールされていない場合に、
インストーラーを起動するなんてこともできるかもしれませんね。

ではでは。

スポンサーリンク


関連するコンテンツ

2017年11月26日C#,開発C#,WPF,プログラミング

Posted by doradora