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)
我找到了一些黑客解决方案。
通过定期将覆盖窗口置于前面,我可以将其置于 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 顺序在其他版本上是否也是如此。
归档时间: |
|
查看次数: |
449 次 |
最近记录: |