GUI/StartupManager.cs
author moel.mich
Tue, 25 May 2010 18:57:28 +0000
changeset 127 76aaf45a01c7
parent 120 41dc766e28b8
child 129 efb1b414d33e
permissions -rw-r--r--
Added a workaround for the "You must keep the stream open for the lifetime of the Image." problem of the Image.FromStream method. This also reduced the overall memory usage (private working set).
moel@82
     1
/*
moel@82
     2
  
moel@82
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@82
     4
moel@82
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@82
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@82
     7
  the License. You may obtain a copy of the License at
moel@82
     8
 
moel@82
     9
  http://www.mozilla.org/MPL/
moel@82
    10
moel@82
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@82
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@82
    13
  for the specific language governing rights and limitations under the License.
moel@82
    14
moel@82
    15
  The Original Code is the Open Hardware Monitor code.
moel@82
    16
moel@82
    17
  The Initial Developer of the Original Code is 
moel@82
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@82
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@82
    20
  the Initial Developer. All Rights Reserved.
moel@82
    21
moel@82
    22
  Contributor(s):
moel@82
    23
moel@82
    24
  Alternatively, the contents of this file may be used under the terms of
moel@82
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@82
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@82
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@82
    28
  of those above. If you wish to allow use of your version of this file only
moel@82
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@82
    30
  use your version of this file under the terms of the MPL, indicate your
moel@82
    31
  decision by deleting the provisions above and replace them with the notice
moel@82
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@82
    33
  the provisions above, a recipient may use your version of this file under
moel@82
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@82
    35
 
moel@82
    36
*/
moel@82
    37
moel@82
    38
using System;
moel@82
    39
using System.Collections.Generic;
moel@82
    40
using System.IO;
moel@123
    41
using System.Security.Principal;
moel@82
    42
using System.Windows.Forms;
moel@82
    43
using Microsoft.Win32;
moel@82
    44
using OpenHardwareMonitor.TaskScheduler;
moel@82
    45
moel@82
    46
namespace OpenHardwareMonitor.GUI {
moel@82
    47
  public class StartupManager {
moel@82
    48
moel@82
    49
    private TaskSchedulerClass scheduler;
moel@82
    50
    private bool startup;
moel@82
    51
moel@82
    52
    private const string REGISTRY_RUN =
moel@82
    53
      @"Software\Microsoft\Windows\CurrentVersion\Run";
moel@82
    54
moel@123
    55
    private bool IsAdministrator() {
moel@123
    56
      try {
moel@123
    57
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
moel@123
    58
        WindowsPrincipal principal = new WindowsPrincipal(identity);
moel@123
    59
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
moel@123
    60
      } catch {
moel@123
    61
        return false;
moel@123
    62
      }
moel@123
    63
    }
moel@123
    64
moel@82
    65
    public StartupManager() {
moel@123
    66
      if (IsAdministrator()) {
moel@123
    67
        try {
moel@123
    68
          scheduler = new TaskSchedulerClass();
moel@123
    69
          scheduler.Connect(null, null, null, null);
moel@123
    70
        } catch {
moel@123
    71
          scheduler = null;
moel@123
    72
        }
moel@123
    73
moel@123
    74
        if (scheduler != null) {
moel@123
    75
          try {
moel@123
    76
            ITaskFolder folder = scheduler.GetFolder("\\Open Hardware Monitor");
moel@123
    77
            IRegisteredTask task = folder.GetTask("Startup");
moel@123
    78
            startup = task != null;
moel@123
    79
          } catch (IOException) {
moel@123
    80
            startup = false;
moel@123
    81
          } catch (UnauthorizedAccessException) {
moel@123
    82
            scheduler = null;
moel@123
    83
          }
moel@123
    84
        } 
moel@123
    85
      } else {
moel@82
    86
        scheduler = null;
moel@82
    87
      }
moel@120
    88
            
moel@120
    89
      if (scheduler == null) {
moel@82
    90
        RegistryKey key = Registry.CurrentUser.OpenSubKey(REGISTRY_RUN);
moel@82
    91
        startup = false;
moel@82
    92
        if (key != null) {
moel@82
    93
          string value = (string)key.GetValue("OpenHardwareMonitor");
moel@82
    94
          if (value != null)
moel@82
    95
            startup = value == Application.ExecutablePath;
moel@82
    96
        }
moel@82
    97
      }
moel@82
    98
    }
moel@82
    99
moel@82
   100
    private void CreateSchedulerTask() {
moel@82
   101
      ITaskDefinition definition = scheduler.NewTask(0);
moel@82
   102
      definition.RegistrationInfo.Description =
moel@82
   103
        "This task starts the Open Hardware Monitor on Windows startup.";
moel@82
   104
      definition.Principal.RunLevel =
moel@82
   105
        TASK_RUNLEVEL.TASK_RUNLEVEL_HIGHEST;
moel@82
   106
      definition.Settings.DisallowStartIfOnBatteries = false;
moel@82
   107
      definition.Settings.StopIfGoingOnBatteries = false;
moel@82
   108
      definition.Settings.ExecutionTimeLimit = "PT0S";
moel@82
   109
moel@82
   110
      ILogonTrigger trigger = (ILogonTrigger)definition.Triggers.Create(
moel@82
   111
        TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON);
moel@82
   112
moel@82
   113
      IExecAction action = (IExecAction)definition.Actions.Create(
moel@82
   114
        TASK_ACTION_TYPE.TASK_ACTION_EXEC);
moel@82
   115
      action.Path = Application.ExecutablePath;
moel@82
   116
      action.WorkingDirectory =
moel@82
   117
        Path.GetDirectoryName(Application.ExecutablePath);
moel@82
   118
moel@82
   119
      ITaskFolder root = scheduler.GetFolder("\\");
moel@82
   120
      ITaskFolder folder;
moel@82
   121
      try {
moel@82
   122
        folder = root.GetFolder("Open Hardware Monitor");
moel@104
   123
      } catch (IOException) {
moel@82
   124
        folder = root.CreateFolder("Open Hardware Monitor", "");
moel@82
   125
      }
moel@82
   126
      folder.RegisterTaskDefinition("Startup", definition,
moel@82
   127
        (int)TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null,
moel@82
   128
        TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, "");
moel@82
   129
    }
moel@82
   130
moel@82
   131
    private void DeleteSchedulerTask() {
moel@82
   132
      ITaskFolder root = scheduler.GetFolder("\\");
moel@82
   133
      try {
moel@82
   134
        ITaskFolder folder = root.GetFolder("Open Hardware Monitor");
moel@82
   135
        folder.DeleteTask("Startup", 0);
moel@104
   136
      } catch (IOException) { }
moel@82
   137
      try {
moel@82
   138
        root.DeleteFolder("Open Hardware Monitor", 0);
moel@104
   139
      } catch (IOException) { }
moel@82
   140
    }
moel@82
   141
moel@82
   142
    private void CreateRegistryRun() {
moel@82
   143
      RegistryKey key = Registry.CurrentUser.CreateSubKey(REGISTRY_RUN);
moel@82
   144
      key.SetValue("OpenHardwareMonitor", Application.ExecutablePath);
moel@82
   145
    }
moel@82
   146
moel@82
   147
    private void DeleteRegistryRun() {
moel@82
   148
      RegistryKey key = Registry.CurrentUser.CreateSubKey(REGISTRY_RUN);
moel@82
   149
      key.DeleteValue("OpenHardwareMonitor");
moel@82
   150
    }
moel@82
   151
moel@82
   152
    public bool Startup {
moel@82
   153
      get {
moel@82
   154
        return startup;
moel@82
   155
      }
moel@82
   156
      set {
moel@82
   157
        if (startup != value) {
moel@82
   158
          startup = value;
moel@82
   159
          if (scheduler != null) {
moel@82
   160
            if (startup)
moel@82
   161
              CreateSchedulerTask();
moel@82
   162
            else
moel@82
   163
              DeleteSchedulerTask();
moel@82
   164
          } else {
moel@82
   165
            if (startup)
moel@82
   166
              CreateRegistryRun();
moel@82
   167
            else
moel@82
   168
              DeleteRegistryRun();
moel@82
   169
          }
moel@82
   170
        }
moel@82
   171
      }
moel@82
   172
    }
moel@82
   173
  }
moel@82
   174
moel@82
   175
 
moel@82
   176
moel@82
   177
 
moel@82
   178
moel@82
   179
}