2016-05-23 16 views
5

Ich entwickle eine assistive Technologieanwendung (in C#), die Informationen über dem aktuell geöffneten Fenster überlagert. Es erkennt anklickbare Elemente und kennzeichnet sie.Wie zeichnet man über das Kontextmenü in .NET/C#?

Um dies zu tun, ich derzeit ein randloses, transparentes Fenster mit TopMost auf "true" erstellen und die Beschriftungen darauf zeichnen. Das bedeutet, dass sich immer ein Fenster vor der aktuellen Anwendung befindet, auf der ich die Beschriftungen zeichnen kann.

Das Problem ist, dieses Fenster deckt nicht das Rechtsklick-Menü - nur andere Fenster. Wenn der Benutzer mit der rechten Maustaste klickt, wird das Kontextmenü über das Overlay gezeichnet.

Ich muss in der Lage sein, Elemente im Kontextmenü zu kennzeichnen, aber ich kann nicht mit der aktuellen Implementierung darauf zeichnen. Kennt jemand eine Lösung?

Edit: Dies ist der relevante Code zum Zeichnen des Overlays. Ich habe die Formularoptionen im Formular-Designer festgelegt, nicht im Code explizit, also bin ich mir nicht sicher, wie viel es helfen wird. Ich habe den Code nicht im Zusammenhang mit Zeichnung entfernt, oder das Formular selbst:

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

Können Sie Ihren Code für das Overlay – Jacobr365

+0

@ Jacob365 zeigen - Sicher Sache, hinzugefügt. :) – JackCC

+0

Ich glaube nicht, dass das möglich ist. Das Kontextmenü wird noch "oberster" als Ihr Formular gezeichnet, da es vom Betriebssystem den Fokus und eine höhere Z-Reihenfolge erhält. – DonBoitnott

Antwort

0

ich ein bisschen wie eine Hack Lösung gefunden habe.

Indem ich das Overlay-Fenster regelmäßig nach vorne bringe, kann ich es an die Spitze der Z-Reihenfolge bringen, wo es das Rechtsklick-Menü abdeckt. Es ist nicht perfekt, aber es funktioniert. Dies ist das Kernkonzept, mit Multithreading gezupft:

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

(Dies setzt voraus, „OverlayForm“ ist ein Formular mit dem entsprechenden Flags in dem Formulardesigner eingestellt - dh „Always on Top“, „Transparenz Key“, " Randlos, "" Maximiert ", usw.)

Ich habe dies nur unter Windows 8.1 getestet. Ich weiß nicht, ob sich die Z-Reihenfolge in anderen Versionen so verhält.

0

Fügen Sie Ihrem Formular ein Kontextmenü hinzu und weisen Sie es dann in den Eigenschaften des Steuerelements unter ContextMenuStrip zu.

+0

Ich muss in der Lage sein, über jedes Kontextmenü in jeder Anwendung zu zeichnen, fürchte ich - nicht nur dieses Programm. Das Tool erweitert alle Programme, um sie für Benutzer mit Behinderungen zugänglich zu machen. Schlägst du vor, dieses Menü im Overlay-Fenster zu implementieren und es mit Ersatzstreifen zu füllen, die mit dem darunterliegenden Kontextmenü identisch sind, mit hinzugefügten Labels? – JackCC