mirror of
https://github.com/ShareX/ShareX.git
synced 2024-10-06 05:05:42 +13:00
231 lines
No EOL
8.6 KiB
C#
231 lines
No EOL
8.6 KiB
C#
#region License Information (GPL v3)
|
|
|
|
/*
|
|
ShareX - A program that allows you to take screenshots and share any file type
|
|
Copyright (c) 2007-2020 ShareX Team
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
Optionally you can also view the license at <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#endregion License Information (GPL v3)
|
|
|
|
using ShareX.HelpersLib;
|
|
using ShareX.Properties;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
|
|
namespace ShareX
|
|
{
|
|
public class HotkeyManager
|
|
{
|
|
public List<HotkeySettings> Hotkeys { get; private set; }
|
|
public bool IgnoreHotkeys { get; set; }
|
|
|
|
public delegate void HotkeyTriggerEventHandler(HotkeySettings hotkeySetting);
|
|
public delegate void HotkeysToggledEventHandler(bool hotkeysEnabled);
|
|
|
|
public HotkeyTriggerEventHandler HotkeyTrigger;
|
|
public HotkeysToggledEventHandler HotkeysToggledTrigger;
|
|
|
|
private HotkeyForm hotkeyForm;
|
|
|
|
public HotkeyManager(HotkeyForm form)
|
|
{
|
|
hotkeyForm = form;
|
|
hotkeyForm.HotkeyPress += hotkeyForm_HotkeyPress;
|
|
hotkeyForm.FormClosed += (sender, e) => hotkeyForm.InvokeSafe(() => UnregisterAllHotkeys(false));
|
|
}
|
|
|
|
public void UpdateHotkeys(List<HotkeySettings> hotkeys, bool showFailedHotkeys)
|
|
{
|
|
if (Hotkeys != null)
|
|
{
|
|
UnregisterAllHotkeys();
|
|
}
|
|
|
|
Hotkeys = hotkeys;
|
|
|
|
RegisterAllHotkeys();
|
|
|
|
if (showFailedHotkeys)
|
|
{
|
|
ShowFailedHotkeys();
|
|
}
|
|
}
|
|
|
|
private void hotkeyForm_HotkeyPress(ushort id, Keys key, Modifiers modifier)
|
|
{
|
|
if (!IgnoreHotkeys && (!Program.Settings.DisableHotkeysOnFullscreen || !CaptureHelpers.IsActiveWindowFullscreen()))
|
|
{
|
|
HotkeySettings hotkeySetting = Hotkeys.Find(x => x.HotkeyInfo.ID == id);
|
|
|
|
if (hotkeySetting != null)
|
|
{
|
|
OnHotkeyTrigger(hotkeySetting);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void OnHotkeyTrigger(HotkeySettings hotkeySetting)
|
|
{
|
|
if (HotkeyTrigger != null)
|
|
{
|
|
HotkeyTrigger(hotkeySetting);
|
|
}
|
|
}
|
|
|
|
public void RegisterHotkey(HotkeySettings hotkeySetting)
|
|
{
|
|
if (!Program.Settings.DisableHotkeys || hotkeySetting.TaskSettings.Job == HotkeyType.DisableHotkeys)
|
|
{
|
|
UnregisterHotkey(hotkeySetting, false);
|
|
|
|
if (hotkeySetting.HotkeyInfo.Status != HotkeyStatus.Registered && hotkeySetting.HotkeyInfo.IsValidHotkey)
|
|
{
|
|
hotkeyForm.RegisterHotkey(hotkeySetting.HotkeyInfo);
|
|
|
|
if (hotkeySetting.HotkeyInfo.Status == HotkeyStatus.Registered)
|
|
{
|
|
DebugHelper.WriteLine("Hotkey registered: " + hotkeySetting);
|
|
}
|
|
else if (hotkeySetting.HotkeyInfo.Status == HotkeyStatus.Failed)
|
|
{
|
|
DebugHelper.WriteLine("Hotkey register failed: " + hotkeySetting);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!Hotkeys.Contains(hotkeySetting))
|
|
{
|
|
Hotkeys.Add(hotkeySetting);
|
|
}
|
|
}
|
|
|
|
public void RegisterAllHotkeys()
|
|
{
|
|
foreach (HotkeySettings hotkeySetting in Hotkeys.ToArray())
|
|
{
|
|
RegisterHotkey(hotkeySetting);
|
|
}
|
|
}
|
|
|
|
public void UnregisterHotkey(HotkeySettings hotkeySetting, bool removeFromList = true)
|
|
{
|
|
if (hotkeySetting.HotkeyInfo.Status == HotkeyStatus.Registered)
|
|
{
|
|
hotkeyForm.UnregisterHotkey(hotkeySetting.HotkeyInfo);
|
|
|
|
if (hotkeySetting.HotkeyInfo.Status == HotkeyStatus.NotConfigured)
|
|
{
|
|
DebugHelper.WriteLine("Hotkey unregistered: " + hotkeySetting);
|
|
}
|
|
else if (hotkeySetting.HotkeyInfo.Status == HotkeyStatus.Failed)
|
|
{
|
|
DebugHelper.WriteLine("Hotkey unregister failed: " + hotkeySetting);
|
|
}
|
|
}
|
|
|
|
if (removeFromList)
|
|
{
|
|
Hotkeys.Remove(hotkeySetting);
|
|
}
|
|
}
|
|
|
|
public void UnregisterAllHotkeys(bool removeFromList = true, bool temporary = false)
|
|
{
|
|
if (Hotkeys != null)
|
|
{
|
|
foreach (HotkeySettings hotkeySetting in Hotkeys.ToArray())
|
|
{
|
|
if (!temporary || hotkeySetting.TaskSettings.Job != HotkeyType.DisableHotkeys)
|
|
{
|
|
UnregisterHotkey(hotkeySetting, removeFromList);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void ToggleHotkeys(bool hotkeysDisabled)
|
|
{
|
|
if (!hotkeysDisabled)
|
|
{
|
|
RegisterAllHotkeys();
|
|
}
|
|
else
|
|
{
|
|
UnregisterAllHotkeys(false, true);
|
|
}
|
|
|
|
if (HotkeysToggledTrigger != null)
|
|
{
|
|
HotkeysToggledTrigger(hotkeysDisabled);
|
|
}
|
|
}
|
|
|
|
public void ShowFailedHotkeys()
|
|
{
|
|
List<HotkeySettings> failedHotkeysList = Hotkeys.Where(x => x.HotkeyInfo.Status == HotkeyStatus.Failed).ToList();
|
|
|
|
if (failedHotkeysList.Count > 0)
|
|
{
|
|
string failedHotkeys = string.Join("\r\n", failedHotkeysList.Select(x => x.TaskSettings.ToString() + ": " + x.HotkeyInfo.ToString()));
|
|
string hotkeyText = failedHotkeysList.Count > 1 ? Resources.HotkeyManager_ShowFailedHotkeys_hotkeys : Resources.HotkeyManager_ShowFailedHotkeys_hotkey;
|
|
string text = string.Format(Resources.HotkeyManager_ShowFailedHotkeys_Unable_to_register_hotkey, hotkeyText, failedHotkeys);
|
|
|
|
string[] processNames = new string[] { "ShareX", "OneDrive", "Dropbox", "Greenshot", "ScreenshotCaptor", "FSCapture", "Snagit32", "puush", "Lightshot" };
|
|
int ignoreProcess = Process.GetCurrentProcess().Id;
|
|
List<string> conflictProcessNames = Process.GetProcesses().Where(x => x.Id != ignoreProcess && !string.IsNullOrEmpty(x.ProcessName) &&
|
|
processNames.Any(x2 => x.ProcessName.Equals(x2, StringComparison.InvariantCultureIgnoreCase))).
|
|
Select(x => string.Format("{0} ({1})", x.MainModule.FileVersionInfo.ProductName, x.MainModule.ModuleName)).ToList();
|
|
|
|
if (conflictProcessNames != null && conflictProcessNames.Count > 0)
|
|
{
|
|
text += "\r\n\r\n" + Resources.HotkeyManager_ShowFailedHotkeys_These_applications_could_be_conflicting_ + "\r\n\r\n" + string.Join("\r\n", conflictProcessNames);
|
|
}
|
|
|
|
MessageBox.Show(text, "ShareX - " + Resources.HotkeyManager_ShowFailedHotkeys_Hotkey_registration_failed, MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
}
|
|
}
|
|
|
|
public void ResetHotkeys()
|
|
{
|
|
UnregisterAllHotkeys();
|
|
Hotkeys.AddRange(GetDefaultHotkeyList());
|
|
RegisterAllHotkeys();
|
|
|
|
if (Program.Settings.DisableHotkeys)
|
|
{
|
|
TaskHelpers.ToggleHotkeys();
|
|
}
|
|
}
|
|
|
|
public static List<HotkeySettings> GetDefaultHotkeyList()
|
|
{
|
|
return new List<HotkeySettings>
|
|
{
|
|
new HotkeySettings(HotkeyType.RectangleRegion, Keys.Control | Keys.PrintScreen),
|
|
new HotkeySettings(HotkeyType.PrintScreen, Keys.PrintScreen),
|
|
new HotkeySettings(HotkeyType.ActiveWindow, Keys.Alt | Keys.PrintScreen),
|
|
new HotkeySettings(HotkeyType.ScreenRecorder, Keys.Shift | Keys.PrintScreen),
|
|
new HotkeySettings(HotkeyType.ScreenRecorderGIF, Keys.Control | Keys.Shift | Keys.PrintScreen)
|
|
};
|
|
}
|
|
}
|
|
} |