You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
4.0 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. using Microsoft.Win32;
  2. using System;
  3. using System.IO;
  4. using System.Windows.Forms;
  5. namespace Apewer.Internals
  6. {
  7. /// <summary>注册表。</summary>
  8. static class RegistryHelper
  9. {
  10. /// <summary>用户登录后的启动项。</summary>
  11. const string Run = @"Software\Microsoft\Windows\CurrentVersion\Run";
  12. /// <summary>HKEY_CURRENT_USER</summary>
  13. /// <remarks>当前用户的信息。</remarks>
  14. public static RegistryKey CurrentUser { get => Registry.CurrentUser; }
  15. /// <summary>HKEY_LOCAL_MACHINE</summary>
  16. /// <remarks>系统信息,对所有用户生效,设置需要管理员权限。</remarks>
  17. public static RegistryKey LocalMachine { get => Registry.LocalMachine; }
  18. /// <summary>获取值。</summary>
  19. /// <param name="root">注册表存储区。</param>
  20. /// <param name="key">路径。</param>
  21. /// <param name="name">名称。</param>
  22. /// <returns>值。获取失败时返回 NULL 值。</returns>
  23. public static object Get(RegistryKey root, string key, string name)
  24. {
  25. try
  26. {
  27. #if !NET20
  28. using
  29. #endif
  30. var rkey = root.OpenSubKey(key, RegistryKeyPermissionCheck.ReadSubTree);
  31. var names = rkey.GetValueNames();
  32. if (names.Contains(name))
  33. {
  34. var value = rkey.GetValue(name, null);
  35. return value;
  36. }
  37. }
  38. catch { }
  39. return null;
  40. }
  41. /// <summary>获取字符串。</summary>
  42. /// <param name="root">注册表存储区。</param>
  43. /// <param name="key">路径。</param>
  44. /// <param name="name">名称。</param>
  45. /// <returns>字符串的值。获取失败时返回 NULL 值。</returns>
  46. public static string GetString(RegistryKey root, string key, string name) => Get(root, key, name) as string;
  47. /// <summary>设置字符串,指定 value 为 NULL 可删除该值。</summary>
  48. /// <param name="root">注册表存储区。</param>
  49. /// <param name="key">路径。</param>
  50. /// <param name="name">名称。</param>
  51. /// <param name="value">值。</param>
  52. /// <returns>错误信息。设置成功时返回 NULL 值。</returns>
  53. public static string Set(RegistryKey root, string key, string name, string value)
  54. {
  55. try
  56. {
  57. #if !NET20
  58. using
  59. #endif
  60. var rkey = root.OpenSubKey(key, RegistryKeyPermissionCheck.ReadWriteSubTree);
  61. var apps = rkey.GetSubKeyNames();
  62. if (value.IsEmpty()) rkey.DeleteValue(name, true);
  63. else rkey.SetValue(name, value, RegistryValueKind.String);
  64. return null;
  65. }
  66. catch (Exception ex)
  67. {
  68. return ex.Message;
  69. }
  70. }
  71. /// <summary>设置当前用户的启动项。</summary>
  72. /// <remarks>错误消息。</remarks>
  73. public static void SetRun(string name, string command)
  74. {
  75. var old = GetString(CurrentUser, Run, name);
  76. if (old.IsEmpty()) Set(CurrentUser, Run, name, command);
  77. }
  78. /// <summary>取消当前用户的启动项。</summary>
  79. /// <remarks>错误消息。</remarks>
  80. public static void CancelRun(string name)
  81. {
  82. Set(CurrentUser, Run, name, null);
  83. }
  84. /// <summary>已启用自动启动。</summary>
  85. public static bool UserAutoRun
  86. {
  87. get
  88. {
  89. var path = Application.ExecutablePath;
  90. var name = Path.GetFileNameWithoutExtension(path);
  91. var value = GetString(CurrentUser, Run, name);
  92. return value == path;
  93. }
  94. set
  95. {
  96. var path = Application.ExecutablePath;
  97. var name = Path.GetFileNameWithoutExtension(path);
  98. Set(CurrentUser, Run, name, value ? path : null);
  99. }
  100. }
  101. }
  102. }