如何在.NET / C#中的右键菜单上绘制?

我正在开发一个辅助技术应用程序(在C#中),它将信息叠加在当前打开的窗口之上。 它检测可点击的元素,并标记它们。

为此,我正在创建一个无边框透明窗口,TopMost设置为“true”,并在其上绘制标签。 这意味着在当前应用程序前面总会有一个窗口hover,我可以在其上绘制标签。

问题是,这个窗口不包括右键菜单 – 只包括其他窗口。 当用户右键单击时,将在叠加层上方绘制上下文菜单。

我需要能够在右键单击菜单中标记元素,但我无法在当前实现的基础上绘制它。 有人知道解决方案吗?

编辑:这是绘制叠加层的相关代码。 我在表单设计器中设置了表单选项,而不是代码明确,所以我不确定它会有多大帮助。 我删除了与绘图无关的代码或表单本身:

public partial class OverlayForm : Form { public OverlayForm() { } protected override void OnPaint(PaintEventArgs eventArgs) { base.OnPaint(eventArgs); Graphics graphics = eventArgs.Graphics; Brush brush = new SolidBrush(this.labelColor); foreach (ClickableElement element in this.elements) { Region currentRegion = element.region; graphics.FillRegion(brush, currentRegion); } } } 

我发现了一些黑客解决方案。

通过定期将叠加窗口置于前面,我可以将它带到Z顺序的顶部,它覆盖右键单击菜单。 它并不完美,但确实有效。 这是核心概念,multithreading被剥离:

 public class OverlayManager { OverlayForm overlay; public OverlayManager() { this.overlay = new OverlayForm(); this.overlay.Show(); this.RepeatedlyBringToFront(); } private void RepeatedlyBringToFront() { while (true) { this.overlay.BringToFront(); Thread.Sleep(50); } } } 

(这假定“OverlayForm”是在表单设计器中设置相关标志的表单 – 即“Always on Top”,“Transparency Key”,“Borderless”,“Maximized”等。)

我只在Windows 8.1上测试过这个。 我不知道Z顺序是否在其他版本上表现如此。

将上下文菜单添加到表单,然后在ContextMenuStrip下的控件属性中指定它。

 ContextMenu cm = new ContextMenu(); cm.MenuItems.Add("Item 1"); cm.MenuItems.Add("Item 2"); pictureBox1.ContextMenu = cm;