2020-07-07 07:15:45 +12:00
|
|
|
|
// <copyright file="SingleAppInstance.cs" company="PlaceholderCompany">
|
|
|
|
|
// Copyright (c) PlaceholderCompany. All rights reserved.
|
|
|
|
|
// </copyright>
|
2020-03-17 02:45:19 +13:00
|
|
|
|
|
2020-03-28 12:42:32 +13:00
|
|
|
|
namespace SystemTrayMenu.Utilities
|
2020-03-17 02:45:19 +13:00
|
|
|
|
{
|
2020-07-07 07:15:45 +12:00
|
|
|
|
using System;
|
2022-01-02 07:52:39 +13:00
|
|
|
|
using System.Collections.Generic;
|
2020-07-07 07:15:45 +12:00
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Linq;
|
2022-01-02 07:10:20 +13:00
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using SystemTrayMenu.UserInterface.HotkeyTextboxControl;
|
|
|
|
|
using WindowsInput;
|
2020-07-07 09:37:55 +12:00
|
|
|
|
|
2020-03-17 02:45:19 +13:00
|
|
|
|
internal static class SingleAppInstance
|
|
|
|
|
{
|
2022-02-08 04:41:30 +13:00
|
|
|
|
internal static bool Initialize()
|
2020-03-17 02:45:19 +13:00
|
|
|
|
{
|
2022-01-02 07:10:20 +13:00
|
|
|
|
bool success = true;
|
|
|
|
|
|
|
|
|
|
try
|
2020-03-17 02:45:19 +13:00
|
|
|
|
{
|
2022-01-02 07:10:20 +13:00
|
|
|
|
foreach (Process p in Process.GetProcessesByName(
|
|
|
|
|
Process.GetCurrentProcess().ProcessName).
|
2022-02-08 04:41:30 +13:00
|
|
|
|
Where(s => s.Id != Environment.ProcessId))
|
2020-03-17 02:45:19 +13:00
|
|
|
|
{
|
2022-02-08 04:41:30 +13:00
|
|
|
|
if (Properties.Settings.Default.SendHotkeyInsteadKillOtherInstances)
|
2022-01-02 07:10:20 +13:00
|
|
|
|
{
|
|
|
|
|
Keys modifiers = HotkeyControl.HotkeyModifiersFromString(Properties.Settings.Default.HotKey);
|
|
|
|
|
Keys hotkey = HotkeyControl.HotkeyFromString(Properties.Settings.Default.HotKey);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
2022-02-06 00:47:27 +13:00
|
|
|
|
List<VirtualKeyCode> virtualKeyCodesModifiers = new();
|
2022-01-02 07:52:39 +13:00
|
|
|
|
foreach (string key in modifiers.ToString().ToUpperInvariant().Split(", "))
|
|
|
|
|
{
|
2022-01-02 10:22:18 +13:00
|
|
|
|
if (key == "NONE")
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 07:52:39 +13:00
|
|
|
|
VirtualKeyCode virtualKeyCode = VirtualKeyCode.LWIN;
|
2022-02-08 04:41:30 +13:00
|
|
|
|
virtualKeyCode = key switch
|
2022-01-02 07:52:39 +13:00
|
|
|
|
{
|
2022-02-08 04:41:30 +13:00
|
|
|
|
"ALT" => VirtualKeyCode.MENU,
|
|
|
|
|
_ => (VirtualKeyCode)Enum.Parse(
|
|
|
|
|
typeof(VirtualKeyCode), key.ToUpperInvariant()),
|
|
|
|
|
};
|
2022-01-02 07:52:39 +13:00
|
|
|
|
virtualKeyCodesModifiers.Add(virtualKeyCode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VirtualKeyCode virtualKeyCodeHotkey = 0;
|
2022-01-02 10:22:18 +13:00
|
|
|
|
if (Enum.IsDefined(typeof(VirtualKeyCode), (int)hotkey))
|
2022-01-02 07:52:39 +13:00
|
|
|
|
{
|
2022-01-02 10:22:18 +13:00
|
|
|
|
virtualKeyCodeHotkey = (VirtualKeyCode)(int)hotkey;
|
2022-01-02 07:52:39 +13:00
|
|
|
|
}
|
2022-01-02 07:10:20 +13:00
|
|
|
|
|
2022-01-02 07:52:39 +13:00
|
|
|
|
new InputSimulator().Keyboard.ModifiedKeyStroke(virtualKeyCodesModifiers, virtualKeyCodeHotkey);
|
2022-01-02 07:10:20 +13:00
|
|
|
|
|
2022-01-02 10:22:18 +13:00
|
|
|
|
success = false;
|
2022-01-02 07:10:20 +13:00
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
2022-01-02 07:52:39 +13:00
|
|
|
|
Log.Warn($"Send hoktey {Properties.Settings.Default.HotKey} to other instance failed", ex);
|
2022-01-02 07:10:20 +13:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-17 02:45:19 +13:00
|
|
|
|
|
2022-02-08 04:41:30 +13:00
|
|
|
|
if (!Properties.Settings.Default.SendHotkeyInsteadKillOtherInstances)
|
2020-03-17 02:45:19 +13:00
|
|
|
|
{
|
2022-01-02 07:10:20 +13:00
|
|
|
|
try
|
2020-03-17 02:45:19 +13:00
|
|
|
|
{
|
2020-06-29 19:16:23 +12:00
|
|
|
|
if (!p.CloseMainWindow())
|
|
|
|
|
{
|
|
|
|
|
p.Kill();
|
|
|
|
|
}
|
2020-07-07 07:15:45 +12:00
|
|
|
|
|
2020-03-17 02:45:19 +13:00
|
|
|
|
p.WaitForExit();
|
2020-06-29 19:16:23 +12:00
|
|
|
|
p.Close();
|
2020-03-17 02:45:19 +13:00
|
|
|
|
}
|
2022-01-02 07:10:20 +13:00
|
|
|
|
catch (Exception ex)
|
2020-03-30 06:26:45 +13:00
|
|
|
|
{
|
|
|
|
|
Log.Error("Run as single instance failed", ex);
|
2022-01-02 07:10:20 +13:00
|
|
|
|
success = false;
|
2020-03-30 06:26:45 +13:00
|
|
|
|
}
|
2020-03-17 02:45:19 +13:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-01-02 07:10:20 +13:00
|
|
|
|
catch (Exception ex)
|
2020-03-17 02:45:19 +13:00
|
|
|
|
{
|
2022-01-02 07:10:20 +13:00
|
|
|
|
Log.Error("Run as single instance failed", ex);
|
2020-03-17 02:45:19 +13:00
|
|
|
|
}
|
2022-01-02 07:10:20 +13:00
|
|
|
|
|
|
|
|
|
return success;
|
2020-03-17 02:45:19 +13:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|