Trigger4Win/Trigger/Main.cs
2015-04-10 00:09:58 +00:00

233 lines
6.5 KiB
C#

using System;
using System.Windows.Forms;
using System.Diagnostics;
//System.IO.Ports.SerialData
//System.Management.ManagementEventWatcher
//System.IO.FileSystemWatcher
namespace Trigger
{
/// <summary>
/// <para>The main <see cref="Form"/></para>
/// </summary>
/// <remarks>This <see cref="Form"/> is invisible</remarks>
public partial class Main : Form
{
#region Properties
/// <summary>The logging <see cref="Form"/></summary>
public Log Log;
/// <summary>The global EventManager</summary>
public Events.Manager EventMgr;
/// <summary>The global TaskManager</summary>
public Tasks.Manager TaskMgr;
private StatusView StatusView = null;
/// <summary>
/// <para>Checks whether this process has administrator privileges</para>
/// </summary>
/// <exception cref="System.Security.SecurityException"></exception>
public bool IsAdmin
{
get
{
bool isAdmin = false;
System.Security.Principal.WindowsIdentity winId = System.Security.Principal.WindowsIdentity.GetCurrent();
if (winId != null)
isAdmin = new System.Security.Principal.WindowsPrincipal(winId).IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);
return isAdmin;
}
}
#endregion
#region Events
/// <summary>
/// <para>Is triggered when the application is already running and then gets called with command line arguments</para>
/// </summary>
private event Events.EventPlugin.EventValue<int> OnCommandLineTrigger;
/// <summary>
/// <para>Is triggered when the application is already running and then gets called with command line arguments</para>
/// </summary>
public event Events.EventPlugin.EventValue<int> CommandLineTrigger
{
add
{
OnCommandLineTrigger += value;
}
remove
{
OnCommandLineTrigger -= value;
}
}
#endregion
#region Constructor
/// <summary></summary>
public Main()
{
this.Visible = false;
InitializeComponent();
this.Log = new Log(this);
this.Log.Show();
if (this.IsAdmin)
this.Log.LogLine("Running with admin privileges", Log.Type.Other);
this.EventMgr = new Events.Manager(this);
this.TaskMgr = new Tasks.Manager(this);
this.Log.LogLine(new String('-', 32), Log.Type.Other);
this.RegisterEventForMessage(Classes.System.WindowsMessages.WM_USER);
MessageReceived += new Events.EventPlugin.EventValue<Message>(HandleNewInstance);
}
public Main(Options options) : this()
{
}
#endregion
#region Methods
/// <summary>
/// <para>Creates a new or refreshes the existing <see cref="StatusView"/></para>
/// </summary>
public void RefreshStatus()
{
if (this.StatusView == null || this.StatusView.IsDisposed)
this.StatusView = new StatusView(this);
else
this.StatusView.Refresh();
this.StatusView.Show();
}
/// <summary>
/// <para>Check if the app was started as administrator or restart it with those permissions</para>
/// <para>This method has to be called during the task initialization process because otherwise the app will be restarted when trying to perform an action that requires administrator priviliges</para>
/// </summary>
/// <returns>
/// <para>Whether administrator privileges are possible and requested</para>
/// <para>When the user cancels UAC or some other error occurs this will return false.</para>
/// </returns>
/// <exception cref="System.ComponentModel.Win32Exception"></exception>
public bool RequireAdministrator()
{
if (this.IsAdmin)
return true;
ProcessStartInfo procStart = new ProcessStartInfo(Process.GetCurrentProcess().MainModule.FileName, "-a");
procStart.UseShellExecute = true;
procStart.Verb = "runas"; // run as Admin
this.Log.LogLineDate("Requiring admin privileges...", Trigger.Log.Type.Other);
try
{
Process.Start(procStart);
}
catch (System.ComponentModel.Win32Exception e)
{
if (e.NativeErrorCode != 1223) // 1223 = user aborted UAC
throw;
}
return false;
}
/// <summary>
/// <para>Close the application</para>
/// </summary>
new public void Close()
{
this.Close(true);
}
/// <summary>
/// <para>Ask the user and close the application</para>
/// </summary>
/// <param name="ask">Whether the user shall be asked first</param>
public void Close(bool ask)
{
if (ask)
if (DialogResult.Yes != MessageBox.Show("Do you really want to exit Trigger4Win?", "Quit Trigger4Win", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
return;
base.Close();
}
#endregion
#region Event handler
/// <summary>
/// <para>Do not show this <see cref="Form"/></para>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Main_Shown(object sender, EventArgs e)
{
this.Visible = false;
}
/// <summary>
/// <para>Exit application</para>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmNotifyIcon_Exit_Click(object sender, EventArgs e)
{
this.Close();
}
/// <summary>
/// <para>Show the Log</para>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tmsNotifyIcon_Log_Click(object sender, EventArgs e)
{
this.Log.Show();
this.Log.BringToFront();
((ToolStripMenuItem)sender).Visible = false;
}
/// <summary>
/// <para>Show the log</para>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Log.Show();
}
/// <summary>
/// <para>Show <see cref="StatusView"/>: <see cref="RefreshStatus"/></para>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmNotifyIcon_Status_Click(object sender, EventArgs e)
{
this.RefreshStatus();
}
private void HandleNewInstance(object sender, Events.EventArgsValue<Message> e)
{
if (e.Value.Msg != (int)Classes.System.WindowsMessages.WM_USER)
return;
switch (e.Value.LParam.ToInt32())
{
case -1:
this.TaskMgr.Abort();
Application.Exit();
return;
case -2:
this.Show();
return;
}
switch (e.Value.WParam.ToInt32())
{
case 0:
return;
default:
if (OnCommandLineTrigger != null)
OnCommandLineTrigger(this, new Events.EventArgsValue<int>(e.Value.WParam.ToInt32()));
return;
}
}
#endregion
}
}