Screenshot mit mauszeiger

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Lies die Position und die Art des Zeigers aus und male einen eigenen Zeiger auf das Bild.
    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!
    Du packst den Shot in eine Bitmap und malst drauf:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim bild As Bitmap = New Bitmap("C:\Temp\Test.jpg")
    3. Dim g As Graphics = Graphics.FromImage(bild)
    4. g.DrawLine(Pens.Black, New Point(10, 10), New Point(30, 30))
    5. bild.Save("C:\Temp\Test2.jpg", Imaging.ImageFormat.Jpeg)
    6. End Sub
    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!
    Da hat deine Genialität wieder voll zugeschlagen. Das hast du vollkommen richtig erkannt.

    Ich stelle mal eine äußerst wage These auf:

    Sehen wir uns mal die 4. Zeile etwas genauer an.
    Das erste Wort heißt DrawLine.
    Man kann die Annahme treffen, dass dies aus zwei Wörtern besteht welche zusammengefügt wurden (auch der Großbuchstabe mitten im Wort lässt darauf schließen).
    Es entstehen somit die Wörter:

    Draw und Line. Wenn man sich die fast ausgestorbene Sprache Englisch ansieht und genau nachschlägt entspricht Draw = zeichnen und Line = Linie.

    Somit ergibt sich (hab es selbst kaum geglaubt)

    Zeichnen Linie. Nun noch umformen -> Linie zeichnen! 8| :?: :?: 8|

    EDIT: Sorry musste einfach sein...


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    so habe selbst ne lösung gefunden
    wenn ich das bild geladen habe für ge ich automaisch einen roten punkt ein (klappt auch alles) nur die position soll die der maus sein!

    VB.NET-Quellcode

    1. Dim x As String
    2. Dim y As String
    3. x = Windows.Forms.Cursor.Position.X
    4. y = Windows.Forms.Cursor.Position.Y

    Mein problem ist jetzt Wie gesagt ich habe 2 Bildschirme und meine maus ist auf dem rechten!
    wenn ich jetzt den punkt einfügen lass erscheit er aber auf der linken seite das Bildes also auf dem bild vom linken bildschirm
    der code ermittelt anscheinen nur den acctuellen bildschirm wie kann ich die ganaue Position ermitteln?
    Hi
    schau dir mal folgenden Schnipsel an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private bmpTarget As Bitmap
    2. Private rctObservedBounds As Rectangle
    3. Public Sub New()
    4. InitializeComponent()
    5. InitializeContent()
    6. End Sub
    7. Private Sub InitializeContent()
    8. For Each s As Screen In Screen.AllScreens
    9. rctObservedBounds = Rectangle.Union(s.Bounds, rctObservedBounds)
    10. Next
    11. bmpTarget = New Bitmap(rctObservedBounds.Width, rctObservedBounds.Height)
    12. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
    13. End Sub
    14. Private Function GetFormRectangle() As Rectangle
    15. Dim cpos As Point = PointToScreen(Point.Empty)
    16. Return New Rectangle((cpos.X - rctObservedBounds.Left) * ClientSize.Width \ rctObservedBounds.Width, _
    17. (cpos.Y - rctObservedBounds.Top) * ClientSize.Height \ rctObservedBounds.Height, _
    18. (ClientSize.Width * ClientSize.Width \ rctObservedBounds.Width) + 1, _
    19. (ClientSize.Width * ClientSize.Height \ rctObservedBounds.Height) + 1)
    20. End Function
    21. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    22. MyBase.OnPaint(e)
    23. If Created AndAlso ClientSize.Width > 0 AndAlso ClientSize.Height > 0 Then
    24. e.Graphics.DrawImage(bmpTarget, ClientRectangle)
    25. e.Graphics.FillRectangle(Brushes.Black, GetFormRectangle())
    26. End If
    27. End Sub
    28. Private Sub timUpdater_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timUpdater.Tick
    29. Using g As Graphics = Graphics.FromImage(bmpTarget)
    30. g.CopyFromScreen(rctObservedBounds.Location, Point.Empty, rctObservedBounds.Size)
    31. Using c As Cursor = System.Windows.Forms.Cursor.Current
    32. c.Draw(g, New Rectangle(Cursor.Position, c.Size))
    33. c.Draw(g, New Rectangle(rctObservedBounds.Width - Cursor.Position.X, rctObservedBounds.Height - Cursor.Position.Y, c.Size.Width, c.Size.Height))
    34. c.Draw(g, New Rectangle(Cursor.Position.X, rctObservedBounds.Height - Cursor.Position.Y, c.Size.Width, c.Size.Height))
    35. c.Draw(g, New Rectangle(rctObservedBounds.Width - Cursor.Position.X, Cursor.Position.Y, c.Size.Width, c.Size.Height))
    36. End Using
    37. End Using
    38. Invalidate()
    39. End Sub
    40. Private Sub Form_Disposed(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Disposed
    41. If bmpTarget IsNot Nothing Then bmpTarget.Dispose()
    42. End Sub


    Sämtliche Fehler sind übrigens absichtlich einprogrammiert und dürfen von dir selber entfernt werden, damit du den Code wenigstens mal anschaust. Als kleine Hilfestellung: Der Code zeichnet auf die Instanz bmpTarget der Bitmap-Klasse über den Timer timUpdater (meine eigene Faulheit btw.). Beim Darstellen der Bitmap wird die Form mit einem schwarzen Rechteck überpinselt, da sie sonst wieder inerhalb der Bitmap dargestellt wird.

    Da alle Bildschirme im Moment verwendet werden, hab' ich leider keinen verfügbaren 2. Bildschirm.

    und noch was: Option Strict On für alle Projekte...

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()