Bildschirmraster, Mauszeiger daran fangen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Bildschirmraster, Mauszeiger daran fangen

    Hallo zusammen,

    ich suche eine Programm oder eine Möglichkeit, folgendes zu Realisieren.

    Es soll ein einstellbares Bildschirmraster erzeugt werden (sichtbar oder unsichtbar), an dem sich der Mauszeiger fangen kann. Wenn man in bzw. im DataSet-Designer die Tabellen schön untereinander stellen möchte ist dies mit so einem kleinen Hilfsprogramm viel leichter. Wer CorelDraw kennt, der weiss, was ich meine. Dort kann man Hilfslinien einstellen und daran die Objekte ausrichten.
    Hilfslinien wären natürlich auch nicht schlecht, dann ist man noch flexibler.

    Aktuell nutze ich als kleines Hilfsprogramm Crosshair. Dies zeichnet ein Fadenkreuz über alle Bildschirme (in meinem Falle 3 Stück). Kann ich Euch nur weiterempfehlen.

    In diesem Zusammenhang wäre halt das gesuchte Programm bzw. die Möglichkeit es mit VB.Net zu lösen echt super.

    Das Programm kann in der Systray schlummern und darüber kann dann das Rastermass eingestellt und evtl. die Liniensichtbarkeit eingestellt werden, so dass das Raster nicht so sehr stört.

    Kennt Ihr so ein Programm bzw. wie könnte ich selbst ein solches Programm erstellen? Wie kann man den Mauszeiger an dem Raster "fangen"?

    Vielen Dank

    Volker
    Man könnte mit nem KeyboardHook und nem PInvoke-Aufruf von mouse_event dafür sorgen, dass der Mauszeiger um gewisse (einstellbare) Schritte springt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Volker Bunge schrieb:

    Wie kann man den Mauszeiger an dem Raster "fangen"?
    Was ganz genau soll der Mauszeiger tun bzw. was soll er nicht tun?
    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!
    Hallo zusammen,

    habe selbst schon ein wenig experimentiert

    VB.NET-Quellcode

    1. [/b]Imports System
    2. ' Herkunft: https://www.vb-paradise.de/index.php/Thread/13451-Mouse-Position-festlegen/
    3. Public Class Form1
    4. Dim RasterX As Integer = 20
    5. Dim RasterY As Integer = 20
    6. Public STRG As Boolean
    7. Private WithEvents tim As New Timer With {.Interval = 200, .Enabled = True}
    8. 'Positionierung der Structure-Elemente sicher stellen
    9. <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)>
    10. Public Structure POINTAPI
    11. Public X As Integer
    12. Public Y As Integer
    13. End Structure
    14. <Runtime.InteropServices.DllImport("user32.dll")>
    15. Public Shared Function GetCursorPos(<Runtime.InteropServices.[In](), Runtime.InteropServices.Out()> ByRef pt As POINTAPI) As Integer
    16. End Function
    17. Private Declare Function SetCursorPos Lib "user32" (ByVal X As Integer, ByVal Y As Integer) As Integer
    18. Private Sub tim_Tick(sender As Object, e As System.EventArgs) Handles tim.Tick
    19. Dim mousepos As POINTAPI
    20. Dim ret As Integer = GetCursorPos(mousepos)
    21. STRG = My.Computer.Keyboard.CtrlKeyDown
    22. Me.Text = "Ret = " & CStr(ret) & " X: " & CStr(mousepos.X) &
    23. " Y: " & CStr(mousepos.Y) & " Raster " & Fix(mousepos.X / RasterX) * RasterX & " " & Fix(mousepos.Y / RasterY) * RasterY & " STRG gedrückt " & STRG
    24. If STRG = False Then
    25. SetCursorPos(Fix(mousepos.X / RasterX) * RasterX, Fix(mousepos.Y / RasterY) * RasterY)
    26. End If
    27. Me.Refresh()
    28. End Sub
    29. End Class
    30. [b]


    Wenn die STRG-Taste gedrückt wird, dann ist das Fangen ausgeschalten.

    Vom Prinzip her funktioniert das schon so, dass der Mauszeiger über meine drei Monitore immer alle 20 Pixel "springt".

    Was halt ein wenig stört ist einmal das Drücken der STRG-Taste, damit man ausserhalb des Rasters etwas markieren kann und dann das "springen" der Maus.

    Jetzt weiss ich nicht, wer auch CorelDraw kennt und die Hilfslinien bzw. aus Ausrichten von Objekten an diesen Hilfslinien. Eigentlich wäre ein solches Verhalten perfekt.

    Mein Code hat natürlich noch keine Hilfslinien, aber wenn man erst einmal die o. g. "Probleme" weg bekämme, dann wäre das mit den Hilfslinien eigentlich nur eine Frage eines Array für die X und Y Hilfslinien welches man durchlaufen müsste und dann halt den Mauszeiger daran "fixiieren".

    Hier mal ein Inkscape Video wie ich das meine. CorelDraw funktioniert hier genau so.

    Gruß

    Volker
    @Volker Bunge Also:
    • Option Strict On.
    • Mach Dir ne CheckBox, wo Du den Timer mit schalten kannst.
    • Wenn Dein Programm läuft und Du willst in Word nen Brief schreiben, hubbelt die Maus auch in Word. :thumbdown:
    • Begrenze diese "Funktionalität" auf dieses eine Programmfenster:
      Nutze dazu die Events Enter und Leave Deines Hauptfensters.
    • Beantworte meine Frage aus Post #4 allerdings ohne Verwendung von Code:

    RodFromGermany schrieb:

    Was ganz genau soll der Mauszeiger tun bzw. was soll er nicht tun?
    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!
    Hallo RodFromGermany,

    das mit der STRG - Taste als "Unterbrecher" war auch erst nur einmal ein Versuch.

    Habe gerade gesehen, dass ich den Videolink vergessen haben.

    Da mein Hilfsprogramm mit jedem Programm funktionieren sollte (ob es dann Sinn macht oder nicht ist dann noch eine andere Frage) aber daher müsste es doch ohne eine Form auskommen bzw. die Form müsste dann über alle Bildschirme kpl. gehen.

    Die Maus soll halt so wie in dem Video (ab 3:45) verhalten und das was ich gerade angeklickt habe dann an diese Hilfslinie bzw. Raster "anheften". (Hoffe, dass diese Erklärung reicht)

    Gruß
    Volker

    Volker Bunge schrieb:

    war auch erst nur einmal ein Versuch.
    Gerade da musst Du sicherstellen, dass Du die Geister, die Du rufst, wieder loswerden kannst :!:

    Volker Bunge schrieb:

    Da mein Hilfsprogramm mit jedem Programm funktionieren sollte
    Welchen Sinn sollte das haben?
    Und:
    Da musst Du noch einen "Justage-Offset" einbauen, damit diese Funktionalität phasenrichtig arbeitet.
    Den Link schau ich mir später an.
    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!