LenovoLegionToolkit

Форк
0
89 строк · 2.5 Кб
1
using System;
2
using System.Collections.Generic;
3
using System.Threading.Tasks;
4
using LenovoLegionToolkit.Lib.System;
5
using LenovoLegionToolkit.Lib.Utils;
6

7
namespace LenovoLegionToolkit.Lib.GameDetection;
8

9
internal class GameConfigStoreDetector
10
{
11
    private const string GAME_CONFIG_STORE_HIVE = "HKEY_CURRENT_USER";
12
    private const string GAME_CONFIG_STORE_PATH = @"System\GameConfigStore\Children";
13
    private const string MATCHED_EXE_FULL_PATH_KEY_NAME = "MatchedExeFullPath";
14

15
    public class GameDetectedEventArgs : EventArgs
16
    {
17
        public HashSet<ProcessInfo> Games { get; }
18

19
        public GameDetectedEventArgs(HashSet<ProcessInfo> games)
20
        {
21
            Games = games;
22
        }
23
    }
24

25
    public event EventHandler<GameDetectedEventArgs>? GamesDetected;
26

27
    private IAsyncDisposable? _listener;
28

29
    public Task StartAsync()
30
    {
31
        if (_listener is not null)
32
            return Task.CompletedTask;
33

34
        var lastPaths = GetDetectedGamePaths();
35

36
        _listener = Registry.ObserveKey(GAME_CONFIG_STORE_HIVE, GAME_CONFIG_STORE_PATH, true, () =>
37
        {
38
            if (Log.Instance.IsTraceEnabled)
39
                Log.Instance.Trace($"Registry changed...");
40

41
            var newPaths = GetDetectedGamePaths();
42

43
            if (!newPaths.SetEquals(lastPaths))
44
            {
45
                if (Log.Instance.IsTraceEnabled)
46
                    Log.Instance.Trace($"Detected games changed.");
47

48
                GamesDetected?.Invoke(this, new(newPaths));
49
            }
50

51
            lastPaths = newPaths;
52
        });
53

54
        return Task.CompletedTask;
55
    }
56

57
    public async Task StopAsync()
58
    {
59
        if (_listener != null)
60
            await _listener.DisposeAsync().ConfigureAwait(false);
61
        _listener = null;
62
    }
63

64
    public static HashSet<ProcessInfo> GetDetectedGamePaths()
65
    {
66
        if (Log.Instance.IsTraceEnabled)
67
            Log.Instance.Trace($"Detecting games...");
68

69
        var result = new HashSet<ProcessInfo>();
70

71
        foreach (var subKey in Registry.GetSubKeys(GAME_CONFIG_STORE_HIVE, GAME_CONFIG_STORE_PATH))
72
        {
73
            var exePath = Registry.GetValue(GAME_CONFIG_STORE_HIVE, subKey, MATCHED_EXE_FULL_PATH_KEY_NAME, string.Empty);
74
            if (string.IsNullOrEmpty(exePath))
75
                continue;
76

77
            result.Add(ProcessInfo.FromPath(exePath));
78
        }
79

80
        if (Log.Instance.IsTraceEnabled)
81
        {
82
            Log.Instance.Trace($"Detected games:");
83
            foreach (var r in result)
84
                Log.Instance.Trace($" - {r}");
85
        }
86

87
        return result;
88
    }
89
}
90

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.