startup.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. use std::io;
  2. use std::path::PathBuf;
  3. static APP_KEY: &str = "ClashVerge";
  4. /// get the startup value
  5. /// whether as same as the exe_path
  6. #[cfg(target_os = "windows")]
  7. pub fn get_startup(exe_path: &PathBuf) -> io::Result<bool> {
  8. use winreg::enums::*;
  9. use winreg::RegKey;
  10. let hkcu = RegKey::predef(HKEY_CURRENT_USER);
  11. let cur_var = hkcu.open_subkey_with_flags(
  12. "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
  13. KEY_READ,
  14. )?;
  15. match cur_var.get_value::<String, _>(APP_KEY) {
  16. Ok(path) => {
  17. let exe_path = exe_path.clone();
  18. let exe_path = exe_path.as_os_str().to_str().unwrap();
  19. Ok(path == exe_path)
  20. }
  21. Err(_) => Ok(false),
  22. }
  23. }
  24. /// set the startup on windows
  25. /// delete the reg key if disabled
  26. #[cfg(target_os = "windows")]
  27. pub fn set_startup(enable: bool, exe_path: &PathBuf) -> io::Result<()> {
  28. use winreg::enums::*;
  29. use winreg::RegKey;
  30. let hkcu = RegKey::predef(HKEY_CURRENT_USER);
  31. let cur_var = hkcu.open_subkey_with_flags(
  32. "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
  33. KEY_SET_VALUE,
  34. )?;
  35. match enable {
  36. true => {
  37. let exe_path = exe_path.clone();
  38. let exe_path = exe_path.as_os_str().to_str().unwrap();
  39. cur_var.set_value::<&str, _>(APP_KEY, &exe_path)
  40. }
  41. false => cur_var.delete_value(APP_KEY),
  42. }
  43. }
  44. /// todo
  45. #[cfg(target_os = "macos")]
  46. pub fn get_startup(exe_path: &PathBuf) -> io::Result<bool> {
  47. Ok(true)
  48. }
  49. /// todo
  50. #[cfg(target_os = "macos")]
  51. pub fn set_startup(enable: bool, exe_path: &PathBuf) -> io::Result<()> {
  52. Ok(())
  53. }
  54. #[cfg(target_os = "windows")]
  55. #[test]
  56. fn test() {
  57. let path = PathBuf::from(r"D:\Software\Clash Verge\clash-verge.exe");
  58. assert!(set_startup(true, &path).is_ok());
  59. assert_eq!(get_startup(&path).unwrap(), true);
  60. assert!(set_startup(false, &path).is_ok());
  61. assert_eq!(get_startup(&path).unwrap(), false);
  62. }