Tool wie z.B. Snipping-Tool

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von konjan.

    Tool wie z.B. Snipping-Tool

    Hallo @ all,

    ich möchte gerne ein Tool programmieren wie z.B. das Snipping-Tool von Microsoft.
    Mein Anliegen ist es jedoch, dass das Programm nicht zuerst einen screenshot erstellt und man dann auf diesem den bereich auswählen kann, den man haben möchte.

    Das heisst, wenn ich z.B. die F11 Taste betätige soll man wie z.B. beim Printkey eine Rectangle Funktion haben, mit welcher man dann den Bereich auswählen kann.

    Vielen Dank im Vorraus :)


    Mit freundlichen Grüßen
    Jan Konrad

    konjan schrieb:

    Vielen Dank im Vorraus
    Wofür bedankst du dich? Du hast ja nich mal eine Frage gestellt, auf die man antworten könnte. :|

    konjan schrieb:

    Mein Anliegen ist es jedoch, dass das Programm nicht zuerst einen screenshot erstellt und man dann auf diesem den bereich auswählen kann, den man haben möchte.
    So wird das aber üblicher Weise gemacht, denn ein Auswahlfenster benötigt (wie der Name schon sagt) ein eigenes Fenster. Das führt dazu, dass z.B. KOntextmenüs verschwinden und andere Objekte ihren Fokus verlieren.

    konjan schrieb:

    Das heisst, wenn ich z.B. die F11 Taste betätige soll man wie z.B. beim Printkey eine Rectangle Funktion haben, mit welcher man dann den Bereich auswählen kann.
    Schön, dass man das soll. Und jetzt? Möchtest du wissen, wie das geht? Was hast du bereits? Woran haperts?

    Schau mal da:
    stackoverflow.com/questions/31…uivalent-of-snipping-tool
    Von meinem iPhone gesendet
    mein Problem ist es, das Auswahlfenster zu programmieren. den Code für die Koordinaten der maus beim klicken und meim wieder loslassen habe ich bereits. ich habe ein Problem mit dem Auswahlfenster und wie das bild erzeugt werden soll, da es eben kein kompletten screenshot machen soll sondern direkt nur den gewählten bereich.

    Ich höffe das war nicht zu umständlich erklärt.

    mfg
    Jan

    konjan schrieb:

    Mein Anliegen ist es jedoch, dass das Programm nicht zuerst einen screenshot erstellt und man dann auf diesem den bereich auswählen kann, den man haben möchte.


    ahm..das Snipping -Tool von Windows 7 funktioniert genau so wie du es nachbauen willst? Du wählst zuerst den Bereich aus mittels Aufziehn eines Rechtecks und dann hast du den Screenshot.....
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Wenn Du den Bereich ziehen willst, leg ein unsichtbares Fenster über den gesamten Bildschirm und behandle dort die Mouse-Events.
    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!
    @datsspeed: Ich frage mich immer wieder, warum es solche Beiträge gibt. Da dieses Thema On-Topic ist, nehme ich an, das der Ersteller darauf abzielt, ein entsprechendes Tool selbst zu programmieren.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    @Lukas ich frage mich immer weshalb es solche beiträge wie deine gibt. Frag mal Dr. G. vom SampleScreenshoot tool (=freeware) gibt es zum teil auch sourcen offen die er dann auch nutzen könnte.

    lg
    @datsspeed und genau das ist das Problem die benutzen ALLE (auch das snipping tool die funktion, dass diese erst einen kompletten screenshot erstellen und man dann aus dem screenshot ausschneidet (das erkennt man daran dass der bildschirm einfriert).

    Der Grund warum ich selbst so ein Programm programmieren möchte ist, weil unsere Citrix Server nicht viel Zwischenspeicher besitzen und dadurch bei 24" Monitoren und 24bit Farben der Zwischenspeicher oft nicht reicht da zuerst ein kompletter Screenshot erstellt wird.
    Als übergangslösung haben wir nun auf 12bit umgestellt, aber das ist keine optimale Lösung.
    HolzShots subber Ding ;)
    [Beta] HolzShots v0.9.6.150

    Du musst immer daran denken, was unterscheidet mein Programm von den anderen. Was bringt die Leute dazu mein Programm zu verwenden.
    Ist mein Programm nur für mich / Familie / etc.....

    Warum das Rad neu erfinden wenn es das bereits gibt? Klar kannst du dabei Erfahrung und Wissen sammeln das ist auch ganz deine Entscheidung und Zeit.

    dennoch viel Erfolg, Spaß und Wissen beim Proggen

    Grüßle Marco
    So ich habe nun diese beiden Codes:
    Die Form1 ist die Hauptform, welche startet.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public x0, y0, x1, y1 As Integer
    3. Public w, h As Integer
    4. Public Sub form1_load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. x0 = 0
    6. y0 = 0
    7. x1 = 0
    8. x1 = 0
    9. w = 300
    10. h = 200
    11. End Sub
    12. Public Function Screenshot() As Bitmap
    13. Dim b As New Bitmap(w, h)
    14. Try
    15. Dim g As Graphics = Graphics.FromImage(b)
    16. g.CopyFromScreen(x0, y0, x1, y1, New Size(w, h))
    17. b.Save("c:\Test.png", System.Drawing.Imaging.ImageFormat.Png)
    18. g.Dispose()
    19. Catch ex As Exception
    20. MsgBox(ex.ToString)
    21. End Try
    22. Return b
    23. End Function
    24. Public Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
    25. Me.Hide()
    26. Timer1.Enabled = True
    27. End Sub
    28. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    29. FormKlick.Show()
    30. Timer1.Enabled = False
    31. End Sub
    32. End Class


    Anschließend habe ich noch eine 2. Form (FormKlick) wo ich die Koordinaten per Mausklick hole:

    VB.NET-Quellcode

    1. Public Class FormKlick
    2. Public Sub FormKlick_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    4. Me.WindowState = FormWindowState.Maximized
    5. End Sub
    6. Public Sub nForm_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    7. Form1.x0 = e.Location.X
    8. Form1.y0 = e.Location.Y
    9. End Sub
    10. Sub nForm_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    11. Form1.x1 = e.Location.X
    12. Form1.y1 = e.Location.Y
    13. Form1.w = Form1.x1 - Form1.x0
    14. Form1.h = Form1.y1 - Form1.y0
    15. ' MsgBox("x0: " + Form1.x0.ToString)
    16. ' MsgBox("y0: " + Form1.y0.ToString)
    17. ' MsgBox("x1: " + Form1.x1.ToString)
    18. ' MsgBox("y1: " + Form1.y1.ToString)
    19. ' MsgBox("w: " + Form1.w.ToString)
    20. ' MsgBox("h: " + Form1.h.ToString)
    21. Me.Hide()
    22. Timer1.Enabled = True
    23. End Sub
    24. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    25. Form1.Screenshot()
    26. Form1.Show()
    27. Timer1.Enabled = False
    28. End Sub
    29. End Class


    Das Programm erstellt mir das Bild in der richtigen Größe, aber das Bild ist leer.
    Was mache ich hier falsch?!
    Pack das ganzen Screenshot-Zeug in die FormKlick.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class FormKlick
    2. Public x0, y0 As Integer
    3. Public w, h As Integer
    4. Private main As Form1
    5. Public Sub Init(frm As Form1)
    6. main = frm
    7. End Sub
    8. Public Sub FormKlick_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    10. Me.WindowState = FormWindowState.Maximized
    11. End Sub
    12. Public Sub nForm_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    13. x0 = e.Location.X
    14. y0 = e.Location.Y
    15. End Sub
    16. Sub nForm_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    17. Dim x1, y1 As Integer
    18. x1 = e.Location.X
    19. y1 = e.Location.Y
    20. w = Math.Abs(x1 - x0)
    21. h = Math.Abs(y1 - y0)
    22. w = Math.Max(1, w)
    23. h = Math.Max(1, h)
    24. y0 = Math.Min(y0, y1)
    25. x0 = Math.Min(x0, x1)
    26. Me.Hide()
    27. Timer1.Enabled = True
    28. End Sub
    29. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    30. Timer1.Enabled = False
    31. Screenshot()
    32. main.Show()
    33. End Sub
    34. Public Function Screenshot() As Bitmap
    35. Dim b As New Bitmap(w, h)
    36. Dim g As Graphics = Graphics.FromImage(b)
    37. 'g.CopyFromScreen(x0, y0, x1, y1, New Size(w, h))
    38. g.CopyFromScreen(x0, y0, x0, y0, New Size(w, h))
    39. b.Save("c:\Temp\Test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
    40. g.Dispose()
    41. Return b
    42. End Function
    43. End Class

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Me.Hide()
    4. Timer1.Enabled = True
    5. End Sub
    6. Private klick As FormKlick
    7. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    8. If klick Is Nothing OrElse klick.IsDisposed Then
    9. klick = New FormKlick
    10. End If
    11. klick.Init(Me)
    12. If Not klick.Visible Then
    13. klick.Show()
    14. End If
    15. Timer1.Enabled = False
    16. End Sub
    17. End Class

    Fang ganz weit oben links an zu ziehen. Irgendwo ist da noch der Wurm drin.
    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!
    Es hat funktioniert!
    Es war alles richtig, nur bei dem CopyFromScreen musste ich etwas ändern:

    VB.NET-Quellcode

    1. g.CopyFromScreen(x0, y0, 0, 0, New Size(w, h))


    Schon hats funktioniert. Danke für die viele Hilfe :)
    Besonderen Dank an RodFromGermany

    mfg
    Jan