壁紙が変更されたことを検知して、何かしたい!って場面に遭遇したので簡単に残しておきます。
Microsoft.Win32.SystemEvents.UserPreferenceChanged
は DPI の調整などでも発動するので、
それ以外の方法で知る必要があります。
そこで、 ManagementEventWatcher
を使います。
こんな感じで、デスクトップ画像が何かしら変わったら e.Dump()
が実行されます。
using System.Management; using System.Security.Principal; using System.Threading.Tasks; async Task Main() { var watcher = new ManagementEventWatcher(); var identity = WindowsIdentity.GetCurrent(); var hive = "HKEY_USERS"; var path = $@"{identity.User.Value}\\Control Panel\\Desktop"; var name = "wallpaper"; watcher.Query = new EventQuery($"SELECT * FROM RegistryValueChangeEvent WHERE Hive = '{hive}' AND KeyPath = '{path}' AND ValueName = '{name}'"); watcher.EventArrived += (sender, e) => e.Dump(); watcher.Start(); await Task.Delay(1000 * 30); // wait for 30sec watcher.Stop(); }
レジストリ的には HKEY_CURRENT_USER
から辿れば良いのですが、クエリには使えないようなので、
WindowsIdentity
からユーザーのキーを取得して、フルパスでアクセスしに行っています。
ちなみにレジストリは大文字小文字認識しないようですね。
ということで久しぶりの記事でした。では~ ٩( 'ω' )۶