Kreis Grafik auf der Position des Cursors zeigen

  • C#

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Ok, das mit Topmost ist interessant, nehme ich das heraus und öffne das Windows 7 Startmenü, dann ist der Cursor nicht mehr im Vordergrund! Bei Windows 10 spielt das keine Rolle, durch das neue Startmenü, kommt der Highlighter in keinem Fall in den Vordergrund. Die Andere ist dann Region = ... :)

    Aber nochmal zurück zu MouseMove und Paint, was ist denn jetzt deren Vorteil im Vergleich zu meiner Timer Implementierung?

    VB.neter0101 schrieb:

    ...nehme ich das heraus...
    Das habich nicht gesagt, dass du das einfach herausnehmen sollst.
    Ich sagte, du sollest mal überlegen... - weil es reicht ja, diese Dinge nur einmal zu tun, und sie nicht alle 2 Millisekunden zu wiederholen (was bei mir zum Flimmern führt)).

    Aber jetzt lässt du das unerledigt stehen und fängst das nächste Thema an...

    VB.neter0101 schrieb:

    Woran machst du fest, dass Windows nicht mehr bedienbar ist?
    Daran, dass Windows nicht mehr bedienbar ist.
    Ich konnte mit Maus-Klick das Programm nicht beenden, ich musste per Tastatur das Studio beenden, um das Programm stoppen zu können.
    Bei solch Zustand ist jeder Test augenblicklich vorbei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    weil es reicht ja, diese Dinge nur einmal zu tun, und sie nicht alle 2 Millisekunden zu wiederholen (was bei mir zum Flimmern führt)).

    @ErfinderDesRades, ja da stimme ich dir zu, das war auch eher noch ein Relikt aus vergangenen Zeiten. Interessant ist, dass du dann ein Flimmern wahrgenommen hast, bei mir tritt das nämlich nicht auf (Ich teste auf Win10 und Win7)... Beim TopMost verhält es sich so, dass wenn ich dies nur im Konstruktor aufrufe, das der Highlighter dann zwar in den meisten Fällen auch wirklich im Vordergrund ist, jedoch nicht in jedem Fall. Wenn z.B. das Kontextmenü oder Startmenü geöffnet wird, dann verschwindet der Highlighter hinter diesem. Das konnte ich tatsächlich nur "beheben", indem ich TopMost in den Timer gesetzt habe. ErfinderDesRades, fällt dir für diesen Fall eine andere Lösung ein, vielleicht gibt es eine bessere?

    RodFromGermany schrieb:

    Ich konnte mit Maus-Klick das Programm nicht beenden, ich musste per Tastatur das Studio beenden, um das Programm stoppen zu können.

    @RodFromGermany, achso das meinst du. Ja das habe ich tatsächlich noch nicht einprogrammiert und erstmal "unterschlagen" :) Natürlich muss sowas noch rein, das stimmt auch! Bei "nicht mehr bedienbar" hatte ich an etwas anderes gedacht...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB.neter0101“ ()

    @VB.neter0101 Teste das ganze zunächst mit einem langsameren Timer, damit das Rest-Windows Zeit hat, seine Programme zu bedienen.
    Danach musst Du Dich ran machen, die Performance zu verbessern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe mein ursprüngliches Programm etwas umgebaut, da ich Erweiterungen (Negation, von der aktuellen Implementierung also Fullscreen markiert und "freie Stelle" mit der Maus, und weiteres z.B. Fadenkreuz) plane und ich mir nicht sicher bin, ob die zuvor dargelegte Herangehensweise mit der abgerundeten Forms Anwendung so optimal ist (offene Frage an alle :) ).

    Was ich unterdessen gemacht habe, ist eine Transparente Form, durch die ich durchklicken kann und somit Zugriff auf das System habe. Außerdem plotte ich eine Ellipse auf dem Screen, die dem Pointer folgt. Ich denke das Folgen des Cursors und dein Einwand @RodFromGermany, bezüglich des Abbruchkriteriums habe ich aufgenommen, in der Hinsicht, dass das Programm jetzt in der Taskliste erscheint und dann dort auch beendet werden kann (nicht optimal, aber reicht mir fürs Erste)... Der Timer ist aktuell relativ langsam eingestellt, dass habe ich bewusst zu Testzwecken gemacht, ich denke 50ms wären später ausreichend...

    Wo ich derzeit etwas hänge sind die Transparenz-Effekte. Einmal kurz zur Wiederholung, ich möchte einen simplen Pointer haben und dann auch genau das Gegenteil davon. Was ich mir im Idealfall vorstelle ist sowas wie eine Transparente Form, auf der ein "weniger" Transparentes Objekt in Form einer Ellipse dargestellt ist. Wenn ich das zu kompliziert beschreiben habe, kann ich das bei Fragen gerne weiter präzisieren...

    Hier ist der aktuelle Code:

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. using System.Runtime.InteropServices;
    4. using System.Windows.Forms;
    5. namespace WindowsFormsApp4
    6. {
    7. public partial class Form1 : Form
    8. {
    9. private Point p;
    10. private Rectangle rect;
    11. Brush brush = new SolidBrush(Color.FromArgb(255, 255, 0, 0));
    12. Color form_color = Color.FromArgb(255, 255, 255, 255);
    13. private int rect_height = 100;
    14. private int rect_width = 100;
    15. private byte transparency_value = 30;
    16. [DllImport("user32.dll", SetLastError = true)]
    17. [return: MarshalAs(UnmanagedType.Bool)]
    18. static extern bool GetCursorPos(out Point lpPoint);
    19. [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
    20. public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);
    21. [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
    22. public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong);
    23. [DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
    24. public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags);
    25. public enum GWL
    26. {
    27. ExStyle = -20
    28. }
    29. public enum WS_EX
    30. {
    31. Transparent = 0x20,
    32. Layered = 0x80000
    33. }
    34. public enum LWA
    35. {
    36. ColorKey = 0x1,
    37. Alpha = 0x2
    38. }
    39. public Form1()
    40. {
    41. InitializeComponent();
    42. BackColor = form_color;
    43. TransparencyKey = form_color;
    44. TopMost = true;
    45. WindowState = FormWindowState.Maximized;
    46. int wl = GetWindowLong(this.Handle, GWL.ExStyle);
    47. wl = wl | 0x80000 | 0x20;
    48. SetWindowLong(this.Handle, GWL.ExStyle, wl);
    49. SetLayeredWindowAttributes(this.Handle, 0, transparency_value, LWA.Alpha);
    50. GetCursorPos(out p);
    51. rect = new Rectangle(p.X - (rect_height / 2), p.Y - (rect_width / 2), rect_height, rect_width);
    52. timer1.Interval = 100;
    53. timer1.Start();
    54. }
    55. private void timer1_Tick(object sender, EventArgs e)
    56. {
    57. GetCursorPos(out p);
    58. this.Invalidate(this.rect);
    59. rect.X = p.X - (rect_height / 2);
    60. rect.Y = p.Y - (rect_width / 2);
    61. this.Invalidate(this.rect);
    62. }
    63. private void Form1_Paint(object sender, PaintEventArgs e)
    64. {
    65. e.Graphics.FillEllipse(brush, rect);
    66. }
    67. }
    68. }


    Ich bin noch auf der Suche herauszufinden, wie man es bewerkstelligt, dass die Formtransparent ist, das Objekt auf der Form (Ellipse) jedoch weniger transparent ist...
    @VB.neter0101 OK.
    Wie beendet man das Programm?
    Was soll passieren? Bitte verbal beschreiben, ohne Code zu verwenden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.neter0101 schrieb:

    eim TopMost verhält es sich so, dass wenn ich dies nur im Konstruktor aufrufe,...
    naja - normalerweise ruft man das garnet auf, sondern legt das im Form-Designer fest.
    Aber letztendlich wirds da auch im Konstruktor aufgerufen - also k.A., warum das bei dir nicht zuverlässig funktioniert.
    Es gäbe noch das Load-Event, oder Shown - beides Ereignisse, die nur einmal feuern, aber deutlich später kommen als der Konstruktor.
    @RodFromGermany, geplant ist das Ganze im Tray-Menü (wenn das so heißt) anzuzeigen, sodass man mit einem Rechtsklick das Programm beenden kann. Wie das Programm beendet wird ist aber aktuell nicht mein Problem, den Code für das TrayMenü habe ich schon fertig... Viel wichtiger für mich ist, die Funktionen bereitzustellen dies schließt den Highlighter und die negierte Version davon ein. Wenn das steht mache ich mir gedanken um das "Design"...

    @ErfinderDesRades, ja im Form Designer geht das bestimmt auch, ich habs nur in den Konstruktor gepackt weil ich das übersichtlicher finde. Aber beides läuft ja, wie du auch angemerkt hast auf das selbe hinaus... Deine Anmerkung klingt ein bisschen so, also ob du das bei dir mal getestet hättest und es bei dir immer im Vordergrund war? Wie gesagt bei mir bleibt es nicht im Vordergrund, wenn ich das Kontextmenü aktiviere, dann verschwindet der Highlighter dahinter (was er ja nicht soll) :whistling:

    PS: Danke für die Antworten! (Auch wenn meine Grundproblematik (noch) nicht gelöst ist, dennoch Danke :) )

    VB.neter0101 schrieb:

    klingt ein bisschen so, also ob du das bei dir mal getestet hättest und es bei dir immer im Vordergrund war? Wie gesagt bei mir bleibt es nicht im Vordergrund, wenn ich das Kontextmenü aktiviere, dann verschwindet der Highlighter dahinter (was er ja nicht soll)
    Ja, habich.
    Nur bei meinen Tests gabs kein ContextMenü nirgends.
    Also wenn du möchtest, dass man sich das mal anguckt, wärs vlt eine Idee, eine SampleSolution anzuhängen, die so ist wie das, wovon du redest...
    Ich habe einmal eine Sample-Solution beigefügt. Außerdem habe ich via GIF noch hervorgehoben, was das Problem im Kontextmenü ist, hierfür wurde N++ geöffnet und das Kontexmenü dort aktiviert. Mein Highlighter bleibt hier nicht im Vordergrund, was er aber sollte...



    Welche Probleme habe ich aktuell:
    1.) Der Highlighter soll immer im Vordergrund bleiben!
    2.) Die Transparenz müsste angepasst werden, der Highlighter-Kreis sollte etwas kontrastreicher sein, was sich als schwierig herausstellt, da die Form selbst transparent ist (Testet hier gerne mal verschiedene Transparenzwerte...)
    Bilder
    • CursorHighlighter1.gif

      73,3 kB, 357×233, 142 mal angesehen
    Dateien