#region License Information (GPL v3) /* ShareX - A program that allows you to take screenshots and share any file type Copyright (c) 2007-2024 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 . */ #endregion License Information (GPL v3) using ShareX.HelpersLib; using ShareX.Properties; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace ShareX { public class HotkeyManager { public List 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 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) { HotkeyTrigger?.Invoke(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); } } else { hotkeySetting.HotkeyInfo.Status = HotkeyStatus.NotConfigured; } } if (!Hotkeys.Contains(hotkeySetting)) { Hotkeys.Add(hotkeySetting); } } public void RegisterAllHotkeys() { foreach (HotkeySettings hotkeySetting in Hotkeys.ToArray()) { RegisterHotkey(hotkeySetting); } } public void RegisterFailedHotkeys() { foreach (HotkeySettings hotkeySetting in Hotkeys.Where(x => x.HotkeyInfo.Status == HotkeyStatus.Failed)) { 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); } HotkeysToggledTrigger?.Invoke(hotkeysDisabled); } public void ShowFailedHotkeys() { List failedHotkeysList = Hotkeys.Where(x => x.HotkeyInfo.Status == HotkeyStatus.Failed).ToList(); if (failedHotkeysList.Count > 0) { string failedHotkeys = string.Join("\r\n", failedHotkeysList.Select(x => $"[{x.HotkeyInfo}] {x.TaskSettings}")); 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); 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 GetDefaultHotkeyList() { return new List { 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) }; } } }