なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Windows で壁紙が変更されたことを知りたい

壁紙が変更されたことを検知して、何かしたい!って場面に遭遇したので簡単に残しておきます。
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 からユーザーのキーを取得して、フルパスでアクセスしに行っています。

ちなみにレジストリは大文字小文字認識しないようですね。

ということで久しぶりの記事でした。では~ ٩( 'ω' )۶