LenovoLegionToolkit
89 строк · 2.5 Кб
1using System;2using System.Collections.Generic;3using System.Threading.Tasks;4using LenovoLegionToolkit.Lib.System;5using LenovoLegionToolkit.Lib.Utils;6
7namespace LenovoLegionToolkit.Lib.GameDetection;8
9internal class GameConfigStoreDetector10{
11private const string GAME_CONFIG_STORE_HIVE = "HKEY_CURRENT_USER";12private const string GAME_CONFIG_STORE_PATH = @"System\GameConfigStore\Children";13private const string MATCHED_EXE_FULL_PATH_KEY_NAME = "MatchedExeFullPath";14
15public class GameDetectedEventArgs : EventArgs16{17public HashSet<ProcessInfo> Games { get; }18
19public GameDetectedEventArgs(HashSet<ProcessInfo> games)20{21Games = games;22}23}24
25public event EventHandler<GameDetectedEventArgs>? GamesDetected;26
27private IAsyncDisposable? _listener;28
29public Task StartAsync()30{31if (_listener is not null)32return Task.CompletedTask;33
34var lastPaths = GetDetectedGamePaths();35
36_listener = Registry.ObserveKey(GAME_CONFIG_STORE_HIVE, GAME_CONFIG_STORE_PATH, true, () =>37{38if (Log.Instance.IsTraceEnabled)39Log.Instance.Trace($"Registry changed...");40
41var newPaths = GetDetectedGamePaths();42
43if (!newPaths.SetEquals(lastPaths))44{45if (Log.Instance.IsTraceEnabled)46Log.Instance.Trace($"Detected games changed.");47
48GamesDetected?.Invoke(this, new(newPaths));49}50
51lastPaths = newPaths;52});53
54return Task.CompletedTask;55}56
57public async Task StopAsync()58{59if (_listener != null)60await _listener.DisposeAsync().ConfigureAwait(false);61_listener = null;62}63
64public static HashSet<ProcessInfo> GetDetectedGamePaths()65{66if (Log.Instance.IsTraceEnabled)67Log.Instance.Trace($"Detecting games...");68
69var result = new HashSet<ProcessInfo>();70
71foreach (var subKey in Registry.GetSubKeys(GAME_CONFIG_STORE_HIVE, GAME_CONFIG_STORE_PATH))72{73var exePath = Registry.GetValue(GAME_CONFIG_STORE_HIVE, subKey, MATCHED_EXE_FULL_PATH_KEY_NAME, string.Empty);74if (string.IsNullOrEmpty(exePath))75continue;76
77result.Add(ProcessInfo.FromPath(exePath));78}79
80if (Log.Instance.IsTraceEnabled)81{82Log.Instance.Trace($"Detected games:");83foreach (var r in result)84Log.Instance.Trace($" - {r}");85}86
87return result;88}89}
90