Browse Source

Merge pull request #2166 from studentmain/master

Register restart after system reboot, #2154
tags/4.1.4
Allen Zhu GitHub 6 years ago
parent
commit
ea442e2429
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 9 deletions
  1. +57
    -7
      shadowsocks-csharp/Controller/System/AutoStartup.cs
  2. +6
    -2
      shadowsocks-csharp/Program.cs

+ 57
- 7
shadowsocks-csharp/Controller/System/AutoStartup.cs View File

@@ -1,5 +1,8 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms; using System.Windows.Forms;
using Microsoft.Win32; using Microsoft.Win32;
using Shadowsocks.Util; using Shadowsocks.Util;
@@ -20,8 +23,9 @@ namespace Shadowsocks.Controller
try try
{ {
runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
if ( runKey == null ) {
Logging.Error( @"Cannot find HKCU\Software\Microsoft\Windows\CurrentVersion\Run" );
if (runKey == null)
{
Logging.Error(@"Cannot find HKCU\Software\Microsoft\Windows\CurrentVersion\Run");
return false; return false;
} }
if (enabled) if (enabled)
@@ -32,6 +36,8 @@ namespace Shadowsocks.Controller
{ {
runKey.DeleteValue(Key); runKey.DeleteValue(Key);
} }
// When autostartup setting change, change RegisterForRestart state to avoid start 2 times
RegisterForRestart(!enabled);
return true; return true;
} }
catch (Exception e) catch (Exception e)
@@ -43,10 +49,12 @@ namespace Shadowsocks.Controller
{ {
if (runKey != null) if (runKey != null)
{ {
try {
try
{
runKey.Close(); runKey.Close();
runKey.Dispose(); runKey.Dispose();
} catch (Exception e)
}
catch (Exception e)
{ Logging.LogUsefulException(e); } { Logging.LogUsefulException(e); }
} }
} }
@@ -58,7 +66,8 @@ namespace Shadowsocks.Controller
try try
{ {
runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); runKey = Utils.OpenRegKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
if (runKey == null) {
if (runKey == null)
{
Logging.Error(@"Cannot find HKCU\Software\Microsoft\Windows\CurrentVersion\Run"); Logging.Error(@"Cannot find HKCU\Software\Microsoft\Windows\CurrentVersion\Run");
return false; return false;
} }
@@ -89,13 +98,54 @@ namespace Shadowsocks.Controller
{ {
if (runKey != null) if (runKey != null)
{ {
try {
try
{
runKey.Close(); runKey.Close();
runKey.Dispose(); runKey.Dispose();
} catch (Exception e)
}
catch (Exception e)
{ Logging.LogUsefulException(e); } { Logging.LogUsefulException(e); }
} }
} }
} }
[DllImport("kernel32.dll", SetLastError = true)]
static extern int RegisterApplicationRestart([MarshalAs(UnmanagedType.LPWStr)] string commandLineArgs, int Flags);
[DllImport("kernel32.dll", SetLastError = true)]
static extern int UnregisterApplicationRestart();
enum ApplicationRestartFlags
{
RESTART_NO_CRASH = 1,
RESTART_NO_HANG = 2,
RESTART_NO_PATCH = 4,
RESTART_NO_REBOOT = 8,
}
// register restart after system reboot/update
public static void RegisterForRestart(bool register)
{
// requested register and not autostartup
if (register && !Check())
{
// escape command line parameter
string[] args = new List<string>(Program.Args)
.Select(p => p.Replace("\"", "\\\"")) // escape " to \"
.Select(p => p.IndexOf(" ") >= 0 ? "\"" + p + "\"" : p) // encapsule with "
.ToArray();
string cmdline = string.Join(" ", args);
// first parameter is process command line parameter
// needn't include the name of the executable in the command line
RegisterApplicationRestart(cmdline, (int)ApplicationRestartFlags.RESTART_NO_CRASH | (int)ApplicationRestartFlags.RESTART_NO_HANG);
Logging.Debug("Register restart after system reboot, command line:" + cmdline);
}
// requested unregister, which has no side effect
else if (!register)
{
UnregisterApplicationRestart();
Logging.Debug("Unregister restart after system reboot");
}
}
} }
} }

+ 6
- 2
shadowsocks-csharp/Program.cs View File

@@ -16,13 +16,16 @@ namespace Shadowsocks
{ {
public static ShadowsocksController MainController { get; private set; } public static ShadowsocksController MainController { get; private set; }
public static MenuViewController MenuController { get; private set; } public static MenuViewController MenuController { get; private set; }
public static string[] Args { get; private set; }
/// <summary> /// <summary>
/// 应用程序的主入口点。 /// 应用程序的主入口点。
/// </summary> /// </summary>
/// </summary>
[STAThread] [STAThread]
static void Main()
static void Main(string[] args)
{ {
// store args for further use
Args = args;
// Check OS since we are using dual-mode socket // Check OS since we are using dual-mode socket
if (!Utils.IsWinVistaOrHigher()) if (!Utils.IsWinVistaOrHigher())
{ {
@@ -54,6 +57,7 @@ namespace Shadowsocks
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
AutoStartup.RegisterForRestart(true);
if (!mutex.WaitOne(0, false)) if (!mutex.WaitOne(0, false))
{ {


Loading…
Cancel
Save