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

jca*_*caw 5 .net c# system.drawing winforms

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

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

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

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

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

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);
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

jca*_*caw 0

我找到了一些黑客解决方案。

通过定期将覆盖窗口置于前面,我可以将其置于 Z 顺序的顶部,覆盖右键单击菜单。它并不完美,但确实有效。这是核心概念,去掉了多线程:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(这假设“OverlayForm”是在表单设计器中设置了相关标志的表单 - 即“始终位于顶部”、“透明键”、“无边框”、“最大化”等)

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