Mouse Area für CopyFromScreen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von whitetiiger.

    Mouse Area für CopyFromScreen

    Hallo,
    ich suche bereits seid 3 Tage eine Möglichkeit, wie man es hin bekommt, dass der Markierte Bereit Bildlich erfasst wird.

    Mein Code ist aktuell nur aus der Hand geschrieben, wie ich mir die Funktionsweise Vorstelle.

    Erstmal der Define der X und der Y Variable

    VB.NET-Quellcode

    1. Private X, Y As Integer


    VB.NET-Quellcode

    1. Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    2. Dim Bmap = New Bitmap(X, Y)
    3. Dim gra As Graphics = Graphics.FromImage(Bmap)
    4. gra.CopyFromScreen(Cursor.Position.X, Cursor.Position.Y, 0, 0, Bmap.Size)
    5. Bmap.Save("C:\Users\admin\Desktop\Neuer Ordner\Datei.jpg")
    6. End Sub
    7. Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    8. X = Cursor.Position.X
    9. Y = Cursor.Position.Y
    10. End Sub


    Kann mir da jemand ein Tipp geben?

    Leider gibt es Code Beispiele nur mit ein Fenster, wie dieses Tutorial
    Was genau hast Du vor? Also wie markierst Du den Bereich? Was funktioniert daran nicht?
    Schau Dir mal die Parameter an: msdn.microsoft.com/de-de/library/fw1kt6f9(v=vs.110).aspx
    Als Zielkoordinate hast Du Z(0|0).

    Außerdem solltest Du die verwendeten Sachen freigeben/disposen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    Was genau hast Du vor?

    Ich hab eine Art Upload Manager vor, d.h. man kann ein Bild direkt vom PC erstellen hochladen und den Link im Zwischenspeicher laden. Meine Inspiration nehme ich von "puush", falls du es kennst.

    Trade schrieb:

    Also wie markierst Du den Bereich?

    Denn bereich möchte ich gerne mit der Maus markieren, d.h. Maus drücken, ziehen und wieder loslassen.

    Trade schrieb:

    Was funktioniert daran nicht?

    Er nimmt immer Verschoben auf. und nicht in der Richtigen Größe.

    Trade schrieb:

    Außerdem solltest Du die verwendeten Sachen freigeben/disposen.
    könntest du mir das erklären, hab das noch nicht gemacht.
    Verstehe, eine Art Screenshot-Tool.
    Dein Code hat da aber irgendwie Logikfehler, weil Du die Koordinaten einfach als Größe verwendest. Speichere die Startposition (Cursor-Position) global im MouseDown, lass das Rechteck aufspannen und bei MouseUp nimmste wieder die Cursor-Position als Ziel.
    Dann musste einfach die Größe des Rechtecks abrufen/berechnen und für die Bitmap hernehmen. Das Ganze muss natürlich etwas erweitert werden, wenn das Rechteck nicht nur in eine Richtung aufgespannt werden kann.

    whitetiiger schrieb:

    könntest du mir das erkläre
    Setze die Sachen einfach in einen Using-Block. Wenn etwas IDisposable implementiert, dann solltest Du die dadurch implementierte Methode Dispose aufrufen, um nicht verwaltete Ressourcen freizugeben, denn das macht der GC nicht automatisch und es entstehene Speicherlecks, bis das Programm beendet wird.
    Using setzt um den Block dann ein Try Finally und ruft dort dann am Ende Dispose auf.

    Das solltest Du mit Bitmap und Graphics machen. Generell eben immer mit Objekten, die IDisposable implementieren, wenn Du sie nicht noch woanders hin weitergibst.

    VB.NET-Quellcode

    1. Using Bmap As New Bitmap(X, Y)
    2. Using gra As Graphics = Graphics.FromImage(Bmap)
    3. gra.CopyFromScreen(Cursor.Position.X, Cursor.Position.Y, 0, 0, Bmap.Size)
    4. Bmap.Save("C:\Users\admin\Desktop\Neuer Ordner\Datei.jpg")
    5. End Using
    6. End Using


    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Jetzt kommt eine Schlimme frage, wie berechne ich die Höhe und Weite der 2 Mauspositionen?

    VB.NET-Quellcode

    1. height = Cursor.Position.X - X
    und

    VB.NET-Quellcode

    1. width = Cursor.Position.Y - Y
    ?
    Wenn dann andersrum. Breite ist ja die Differenz der X-Koordinaten und Höhe die der Y-Koordinaten.
    Das gilt allerdings nur, wenn man das "Rechteck" vom Ursprungspunkt aus nur nach rechts unten bewegen kann. Ansonsten ist's natürlich komplexer.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Mit der Größe funktioniert es schon Perfekt, jedoch kommt kein Bild.
    Ich würde sagen, dass es mit hoher Wahrscheinlichkeit daran liegen, dass bei "CopyFromScreen" ein Fehler existiert aber ich finde dort kein Fehler.

    VB.NET-Quellcode

    1. Dim Width As Integer = Cursor.Position.X - X
    2. Dim Height As Integer = Cursor.Position.Y - Y
    3. Dim Bmap = New Bitmap(Width, Height)
    4. Using gra As Graphics = Graphics.FromImage(Bmap)
    5. gra.CopyFromScreen(X, Y, Cursor.Position.X, Cursor.Position.Y, Bmap.Size)
    6. Bmap.Save("C:\Users\admin\Desktop\Neuer Ordner\Datei.jpg")
    7. End Using

    VB.NET-Quellcode

    1. ​sourceX Die x-Koordinate des Punktes in der linken oberen Ecke des Quellrechtecks.

    ist die Quellcordinate von X / Variable X

    VB.NET-Quellcode

    1. sourceY Die y-Koordinate des Punktes in der linken oberen Ecke des Quellrechtecks.

    ist die Quellcordinat von Y / Variable Y

    VB.NET-Quellcode

    1. destinationX Die x-Koordinate des Punktes in der linken oberen Ecke des Zielrechtecks.

    ist die Zielcordinate von X / Funktion Cursor.Position.X

    VB.NET-Quellcode

    1. destinationY Die y-Koordinate des Punktes in der linken oberen Ecke des Zielrechtecks.

    ist die Zielcordinate von Y / Funktion Cursor.Position.Y

    blockRegionSize habe ich mal rausgelassen.

    Allerdings ist es nach meinen Vorstellungen richtig/finde den Fehler nicht.

    ErfinderDesRades schrieb:

    Also die Ziel-Ecke oben links ist (0, 0)
    Das habe ich doch bei dem Callback "Form1_MouseDown", dass er die Cordinaten Zwischen gespeichert.

    VB.NET-Quellcode

    1. ​Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    2. X = Cursor.Position.X
    3. Y = Cursor.Position.Y
    4. End Sub
    Achso, Peinlich :)

    Hab vom Kumpel eine Idee für die Erweiterung bekommen und habe es über 2 Formen gemacht.

    Aber Trotzdem vielen Dank für eure Gute Hilfe