diff --git a/MainForm.cs b/MainForm.cs index f54189a..8f65215 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; +using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Windows.Forms; @@ -14,6 +15,18 @@ namespace AppLauncher { public partial class MainForm : AForm { + [DllImport("user32.dll")] + protected static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); + + [DllImport("user32.dll")] + protected static extern bool UnregisterHotKey(IntPtr hWnd, int id); + + protected const int MOD_ALT = 0x1; + protected const int MOD_CONTROL = 0x2; + protected const int MOD_SHIFT = 0x4; + protected const int MOD_WIN = 0x8; + protected const int WM_HOTKEY = 0x312; + protected int collapsedWidth = 40; protected int expandedWidth = 800; @@ -26,6 +39,13 @@ namespace AppLauncher //this.Visible = false; } + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + RegisterHotKey((IntPtr)Handle, 1, (MOD_CONTROL | MOD_ALT), (int)Keys.F10); + } + protected override void OnShown(EventArgs e) { this.Visible = false; @@ -46,6 +66,8 @@ namespace AppLauncher { base.OnClosing(e); + UnregisterHotKey((IntPtr)Handle, 1); + if (string.IsNullOrWhiteSpace(sessionFilename)) { // do nothing @@ -72,6 +94,21 @@ namespace AppLauncher } } + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + + if (m.Msg != WM_HOTKEY) return; + + switch (m.WParam.ToInt32()) + { + case 1: + this.Visible = !this.Visible; + break; + default: break; + } + } + public async Task ToggleSize() { if (this.Width > collapsedWidth) diff --git a/Program.cs b/Program.cs index 06a2aa3..5f28734 100644 --- a/Program.cs +++ b/Program.cs @@ -1,22 +1,30 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using System.Windows.Forms; namespace AppLauncher { static class Program { + const string applicationID = "f31c9f65-4047-41e4-ac85-dbe11d12ee46"; + /// /// The main entry point for the application. /// [STAThread] static void Main() { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new MainForm()); + System.Threading.Mutex mutex = new System.Threading.Mutex(false, applicationID); + if (mutex.WaitOne(TimeSpan.Zero)) + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + + mutex.ReleaseMutex(); + mutex.Close(); + mutex.Dispose(); + mutex = null; } } } diff --git a/Windows/Forms/AForm.cs b/Windows/Forms/AForm.cs index b394436..d8de44a 100644 --- a/Windows/Forms/AForm.cs +++ b/Windows/Forms/AForm.cs @@ -22,6 +22,8 @@ namespace AppLauncher.Windows.Forms protected internal RyzStudio.Windows.Forms.TImageBox imageBox1; private NotifyIcon notifyIcon1; private Panel panel1; + private ContextMenuStrip contextMenuStrip1; + private ToolStripMenuItem exitToolStripMenuItem; private IContainer components; public AForm() : base() @@ -192,13 +194,16 @@ namespace AppLauncher.Windows.Forms this.imageBox1 = new RyzStudio.Windows.Forms.TImageBox(); this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.panel1 = new System.Windows.Forms.Panel(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.imageBox3)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.imageBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).BeginInit(); + this.contextMenuStrip1.SuspendLayout(); this.SuspendLayout(); - // + // // imageBox3 - // + // this.imageBox3.BackColor = System.Drawing.Color.Transparent; this.imageBox3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; this.imageBox3.ErrorImage = null; @@ -215,9 +220,9 @@ namespace AppLauncher.Windows.Forms this.imageBox3.TabIndex = 146; this.imageBox3.TabStop = false; this.imageBox3.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox3_MouseClick); - // + // // imageBox2 - // + // this.imageBox2.BackColor = System.Drawing.Color.Transparent; this.imageBox2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; this.imageBox2.ErrorImage = null; @@ -234,9 +239,9 @@ namespace AppLauncher.Windows.Forms this.imageBox2.TabIndex = 147; this.imageBox2.TabStop = false; this.imageBox2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox2_MouseClick); - // + // // imageBox1 - // + // this.imageBox1.BackColor = System.Drawing.Color.Transparent; this.imageBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; this.imageBox1.ErrorImage = null; @@ -253,14 +258,17 @@ namespace AppLauncher.Windows.Forms this.imageBox1.TabIndex = 148; this.imageBox1.TabStop = false; this.imageBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox1_MouseClick); - // + // // notifyIcon1 - // + // + this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1; this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); + this.notifyIcon1.Visible = true; this.notifyIcon1.Click += new System.EventHandler(this.notifyIcon1_Click); - // + this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_Click); + // // panel1 - // + // this.panel1.BackColor = System.Drawing.Color.Transparent; this.panel1.Cursor = System.Windows.Forms.Cursors.SizeNS; this.panel1.Location = new System.Drawing.Point(109, 114); @@ -271,9 +279,23 @@ namespace AppLauncher.Windows.Forms this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown); this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove); this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseUp); - // + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exitToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(94, 26); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(93, 22); + this.exitToolStripMenuItem.Text = "E&xit"; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // // AForm - // + // this.ClientSize = new System.Drawing.Size(421, 321); this.Controls.Add(this.panel1); this.Controls.Add(this.imageBox1); @@ -284,6 +306,7 @@ namespace AppLauncher.Windows.Forms ((System.ComponentModel.ISupportInitialize)(this.imageBox3)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.imageBox2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).EndInit(); + this.contextMenuStrip1.ResumeLayout(false); this.ResumeLayout(false); } @@ -294,7 +317,7 @@ namespace AppLauncher.Windows.Forms { //this.WindowState = FormWindowState.Minimized; this.Visible = false; - notifyIcon1.Visible = true; + //notifyIcon1.Visible = true; } } @@ -323,7 +346,7 @@ namespace AppLauncher.Windows.Forms private void notifyIcon1_Click(object sender, EventArgs e) { this.Visible = !this.Visible; - notifyIcon1.Visible = !this.Visible; + //notifyIcon1.Visible = !this.Visible; } private void panel1_MouseDown(object sender, MouseEventArgs e) @@ -348,5 +371,7 @@ namespace AppLauncher.Windows.Forms } } + private void exitToolStripMenuItem_Click(object sender, EventArgs e) => this.Close(); + } } \ No newline at end of file diff --git a/Windows/Forms/AForm.resx b/Windows/Forms/AForm.resx index aec58fb..b723165 100644 --- a/Windows/Forms/AForm.resx +++ b/Windows/Forms/AForm.resx @@ -120,6 +120,9 @@ 17, 17 + + 130, 17 +