using System; using System.Collections.Generic; using System.Windows; using System.Windows.Interop; using HandyControl.Tools.Interop; namespace HandyControl.Tools; public class SystemMenuHook { private static readonly Dictionary DataDic = new(); public static event Action Click; public static void Insert(int index, int id, string text, Window window) { var hookId = window.GetHandle(); var source = HwndSource.FromHwnd(hookId); if (source != null) { DataDic[id] = source; InteropMethods.InsertMenu(InteropMethods.GetSystemMenu(hookId, false), index, InteropValues.MF_BYPOSITION, id, text); source.AddHook(WinProc); } } public static void InsertSeperator(int index, Window window) => InteropMethods.InsertMenu( InteropMethods.GetSystemMenu(window.GetHandle(), false), index, InteropValues.MF_BYPOSITION | InteropValues.MF_SEPARATOR, 0, ""); public static void Remove(int id) { if (DataDic.TryGetValue(id, out var data)) { data.RemoveHook(WinProc); DataDic.Remove(id); } } private static IntPtr WinProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled) { if (msg == InteropValues.WM_SYSCOMMAND) { var id = wparam.ToInt32(); if (DataDic.ContainsKey(id)) { Click?.Invoke(id); } } return IntPtr.Zero; } }