Add to the context menu of the application on the taskbar in .NET.

In most applications there is only "Restore, Move, Size, Minimize, Enlarge and Close", however MS SQL offers additional options "Help, Customize View". Along these lines, you can add an application on the taskbar to the right-click menu?

Note. I do not refer to the icon in the notification area next to the clock.

+7
windows taskbar
source share
4 answers

This article gives you a walk through C #!

+7
source share

This is the simpler answer I found. I quickly checked this and it works.

My code is:

private const int WMTaskbarRClick = 0x0313; protected override void WndProc(ref Message m) { switch (m.Msg) { case WMTaskbarRClick: { // Show your own context menu here, i do it like this // there a context menu present on my main form so i use it MessageBox.Show("I see that."); break; } default: { base.WndProc(ref m); break; } } } 
+1
source share

I created an application and used this code, and it works well, but I ran into a small problem that goes one step further. I created a context menu that is supposed to mimic the Windows System menu by right-clicking. When you right-click on the taskbar, a context menu appears, but the bottom of it stops at the top of the taskbar. The X position is perfect, but I would like the Y position to appear on the taskbar, as in the regular Windows system menu. Is there any way to do this? Here is the code that I entered instead of MessageBox.Show from the code above.

 contextMenuStrip.Show(Cursor.Position.X, Cursor.Position.Y); 
0
source share

The menu when you right-click a minimized program, or Alt + Space, or when you right-click on the window icon in the title bar is called SysMenu.

Here is an option for WPF:

 // License MIT 2019 Mitch Gaffigan // https://stackoverflow.com/a/58160366/138200 public class SysMenu { private readonly Window Window; private readonly List<MenuItem> Items; private bool isInitialized; private IntPtr NextID = (IntPtr)1000; private int StartPosition = 5; public SysMenu(Window window) { this.Items = new List<MenuItem>(); this.Window = window ?? throw new ArgumentNullException(nameof(window)); this.Window.SourceInitialized += this.Window_SourceInitialized; } class MenuItem { public IntPtr ID; public string Text; public Action OnClick; } public void AddSysMenuItem(string text, Action onClick) { if (string.IsNullOrWhiteSpace(text)) { throw new ArgumentNullException(nameof(text)); } if (onClick == null) { throw new ArgumentNullException(nameof(onClick)); } var thisId = NextID; NextID += 1; var newItem = new MenuItem() { ID = thisId, Text = text, OnClick = onClick }; Items.Add(newItem); var thisPosition = StartPosition + Items.Count; if (isInitialized) { var hwndSource = PresentationSource.FromVisual(Window) as HwndSource; if (hwndSource == null) { return; } var hSysMenu = GetSystemMenu(hwndSource.Handle, false); InsertMenu(hSysMenu, thisPosition, MF_BYPOSITION, thisId, text); } } private void Window_SourceInitialized(object sender, EventArgs e) { var hwndSource = PresentationSource.FromVisual(Window) as HwndSource; if (hwndSource == null) { return; } hwndSource.AddHook(WndProc); var hSysMenu = GetSystemMenu(hwndSource.Handle, false); /// Create our new System Menu items just before the Close menu item InsertMenu(hSysMenu, StartPosition, MF_BYPOSITION | MF_SEPARATOR, IntPtr.Zero, string.Empty); int pos = StartPosition + 1; foreach (var item in Items) { InsertMenu(hSysMenu, pos, MF_BYPOSITION, item.ID, item.Text); pos += 1; } isInitialized = true; } private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_SYSCOMMAND) { var item = Items.FirstOrDefault(d => d.ID == wParam); if (item != null) { item.OnClick(); handled = true; return IntPtr.Zero; } } return IntPtr.Zero; } #region Win32 private const Int32 WM_SYSCOMMAND = 0x112; private const Int32 MF_SEPARATOR = 0x800; private const Int32 MF_BYPOSITION = 0x400; private const Int32 MF_STRING = 0x0; [DllImport("user32.dll")] private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); [DllImport("user32.dll")] private static extern bool InsertMenu(IntPtr hMenu, int wPosition, int wFlags, IntPtr wIDNewItem, string lpNewItem); #endregion } 

Usage example:

 internal partial class MainWindow : Window { public MainWindow() { var sysMenu = new SysMenu(this); sysMenu.AddSysMenuItem("Quit", miQuit_Click); sysMenu.AddSysMenuItem("Show debug tools", miShowDebug_Click); } private void miQuit_Click() { // "On-Click" logic here } private void miShowDebug_Click() { // "On-Click" logic here } } 
0
source share

All Articles