前回までは、実現性検討の話をしてきた。
今回からは、これまで検討してきた手段の試行に入る。
まずはこれ
Windowsの更新が必要かどうか検出する。
空っぽのアプリの作成
Visual Studio 2017で「コンソールアプリ (.NET Framework)」のプロジェクトを新規に作成した。
「フレームワーク」は、一応Windows 10で幅広く動作して欲しいので、.NET Framework 4.6.2を選択した。
参照の追加
WUApiLibを使ってWindowsの更新が必要かどうか検出したいので、
WUApiLibへの参照をプロジェクトに追加する。
ソリューションエクスプローラから、プロジェクト名を右クリック→「追加」→「参照」をクリックした。
参照マネージャー画面が表示されるので、画面左側から「COM」を選んで、画面真ん中の列で「WUAPI 2.0 Type Library」にチェックを入れた。
今回はメッセージボックスで簡単な結果を試しに表示してみたいので、画面左側から「アセンブリ」を選んで、画面真ん中の列で「System.Windows.Forms」にチェックを入れた。
OKボタンをポチッとな。
続いて、Program.csファイルの一番上に次の2行を追加した。
using System.Windows.Forms;
using WUApiLib;
これで、Windowsの更新を検出する準備は整った、はず。
核心部分の実装
次のコードを書いた。プログラムを開始した後に次のコードが実行されればどこに書こうが問題ないので、例えばMain関数の中にそのまま書いてもよいし、自分でつくったクラスのメソッドに書いてそれを呼び出してもよい。
var updateSession = new UpdateSession();
var updateSearcher = updateSession.CreateUpdateSearcher();
updateSearcher.Online = false;
try
{
var searchResult = updateSearcher.Search("IsInstalled=0 And IsHidden=0");
if (searchResult.Updates.Count > 0)
{
MessageBox.Show("アップデートがあります!");
}
else
{
MessageBox.Show("アップデートはありません。");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "エラー");
}
Windowsが更新待ちのときは「アップデートがあります!」というメッセージボックスが表示され、更新待ちでないときは「アップデートはありません。」というメッセージボックスが表示される、という仕様でつくったつもり。
いざ、試行
Windowsの更新が特に必要ないとき
これがどういう状況かというと、Windowsをシャットダウンしようとしたら次のような表示になっている状況のことである。
このときのプログラムの実行結果は次のようになった。
Windowsの更新が必要なとき
これは、Windowsをシャットダウンしようとしたら次のような表示になっている状況のことである。
このときのプログラムの実行結果は次のようになった。
今回の結論:
Windowsの更新が必要かどうか(=再起動が必要かどうか)は確かに検出できる。
次回はプログラムからのWindowsの強制再起動を試行する。