12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 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<int, HwndSource> DataDic = new();
- public static event Action<int> 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;
- }
- }
|