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.

109 lines
3.7 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
  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 RegHelper
  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 string 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.GetSubKeyNames();
  32. if (names.Contains(name))
  33. {
  34. var obj = rkey.GetValue(name, null);
  35. var str = obj as string;
  36. return str;
  37. }
  38. }
  39. catch { }
  40. return null;
  41. }
  42. /// <summary>设置字符串,指定 value 为 NULL 可删除该值。</summary>
  43. /// <param name="root">注册表存储区。</param>
  44. /// <param name="key">路径。</param>
  45. /// <param name="name">名称。</param>
  46. /// <param name="value">值。</param>
  47. /// <returns>错误信息。设置成功时返回 NULL 值。</returns>
  48. public static string Set(RegistryKey root, string key, string name, string value)
  49. {
  50. try
  51. {
  52. #if !NET20
  53. using
  54. #endif
  55. var rkey = root.OpenSubKey(key, RegistryKeyPermissionCheck.ReadWriteSubTree);
  56. var apps = rkey.GetSubKeyNames();
  57. if (value.IsEmpty()) rkey.DeleteValue(name, true);
  58. else rkey.SetValue(name, value, RegistryValueKind.String);
  59. return null;
  60. }
  61. catch (Exception ex)
  62. {
  63. return ex.Message;
  64. }
  65. }
  66. /// <summary>设置当前用户的启动项。</summary>
  67. /// <remarks>错误消息。</remarks>
  68. public static void SetRun(string name, string command)
  69. {
  70. var old = Get(CurrentUser, Run, name);
  71. if (old.IsEmpty()) Set(CurrentUser, Run, name, command);
  72. }
  73. /// <summary>取消当前用户的启动项。</summary>
  74. /// <remarks>错误消息。</remarks>
  75. public static void CancelRun(string name)
  76. {
  77. Set(CurrentUser, Run, name, null);
  78. }
  79. /// <summary>已启用自动启动。</summary>
  80. public static bool UserAutoRun
  81. {
  82. get
  83. {
  84. var path = Application.ExecutablePath;
  85. var name = Path.GetFileNameWithoutExtension(path);
  86. var value = Get(CurrentUser, Run, name);
  87. return value == path;
  88. }
  89. set
  90. {
  91. var path = Application.ExecutablePath;
  92. var name = Path.GetFileNameWithoutExtension(path);
  93. Set(CurrentUser, Run, name, value ? path : null);
  94. }
  95. }
  96. }
  97. }