主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2019/06/08
壁紙が変更されたことを検知して、何かしたい!って場面に遭遇したので簡単に残しておきます。
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
からユーザーのキーを取得して、フルパスでアクセスしに行っています。
ちなみにレジストリは大文字小文字認識しないようですね。
ということで久しぶりの記事でした。では~ ٩( 'ω' )۶