2016-05-23 39 views
5

我正在开发一个辅助技术应用程序(用C#),它覆盖当前打开的窗口顶部的信息。它检测可点击的元素,并标记它们。如何在.NET/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); 
     } 
    }  
} 
+1

你可以显示你的代码做覆盖 – Jacobr365

+0

@ Jacobr365 - 当然,补充。 :) – JackCC

+0

我不认为这是可能的。上下文菜单比你的表格更“顶级”,因为它获得了焦点和操作系统的更高z顺序。 – DonBoitnott

回答

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); 
     } 
    } 
} 

(这是假设“OverlayForm”是在窗体设计器设置相关标志形式 - 即“总在最前”,“透明的关键”,“无边界“,”最大化“等)

我只在Windows 8.1上测试过。我不知道Z-order在其他版本中的行为是否如此。

0

将一个上下文菜单添加到您的表单中,然后在ContextMenuStrip下的控件的属性中进行分配。

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

pictureBox1.ContextMenu = cm; 
+0

我需要能够在任何应用程序中绘制任何上下文菜单,恐怕不仅仅是这个程序。该工具扩展了所有程序,使其可供残疾用户访问。您是否建议我在覆盖窗口中实现此菜单,并使用与底层上下文菜单相同的替换条填充它,并添加了标签? – JackCC

相关问题