Pendant zu AutoIT-Befehl "PixelGetColor(x,y)" mit bekannten x und y Werten

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von DieKatze.

    Pendant zu AutoIT-Befehl "PixelGetColor(x,y)" mit bekannten x und y Werten

    Hey, habe schon einige Beiträge mit ähnlichen Fragen gelesen, bin aber leider noch nicht weitergekommen.

    Ich würde gerne meine Maus an eine Stelle bewegen und in einem Label in meiner Form soll die dazugehörige Farbe - genau wie PixelGetColor() aus AutoIT das anstellt - ausgegeben werden. Meine Maus soll sich dabei auf dem ganzen Bildschirm bewegen dürfen.

    Wenn ich das richtig verstanden habe, versucht man mit API- Funktionen einen Screenshot zu erstellen, welcher dann untersucht wird und anschließend wieder gelöscht wird? Nur leider gibt es bei mir immer nur die Fehlermeldungen =(

    Freue mich über jede (hilfreiche Antwort) :thumbsup:

    VB.NET-Quellcode

    1. Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32
    2. <DllImport("User32.dll")> _
    3. Public Shared Function GetWindowDC(ByVal hWnd As IntPtr) As IntPtr
    4. End Function
    5. <DllImport("user32.dll")> _
    6. Public Shared Function ReleaseDC( hwnd As IntPtr, hdc As IntPtr)As Int32
    7. Function GetPixelColor(x As Integer,y as integer)as color
    8. Dim hdc As IntPtr = GetWindowDC(IntPtr.Zero)
    9. Dim cl As Color = Color.FromArgb(CType(GetPixel(hdc,x,y),Integer))
    10. ReleaseDC(IntPtr.Zero,hdc)
    11. Return cl
    12. End function

    sogar C&P Code...die WinAPI Deklerationen sind von PInvoke ;)

    Edit: achja sollte da ein Fehler kommen(z.B. bei DllImport), dann fahr mal mit der Maus drüber bis eine rote Kugel mit einem weißen Ausrufezeichen erscheint, draufklicken und dann die Fehlerbehandlungen angucken, da sollte etwas dabei sein mit "System.Runtime.InteropService"...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke für die schnelle Antwort, habe mir den Code auch gleich einmal/mehrmals angeschaut. Danke an dieser Stelle !

    "System.Runtime.InteropService" musste ich noch am Kopf einfügen, wie du schon vermutet hattest. Zwischen Zeile 6 und 7 habe ich noch ein "End Function" gepackt ;) Da ich noch ein relativer Newbie bin, was Visual Basic angeht (leider so anders als VBA in Excel :( ), stehe ich gerade noch auf dem Schlauch, wie ich jenen Code verwenden kann. Hier der Code für ein bloßes Fenster (genannt "Form1") mit einzig einem 1s - Timer (genannt "Timer1"):




    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32
    4. <DllImport("User32.dll")> _
    5. Public Shared Function GetWindowDC(ByVal hWnd As IntPtr) As IntPtr
    6. End Function
    7. <DllImport("User32.dll")> _
    8. Public Shared Function ReleaseDC(ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As Int32
    9. End Function
    10. Function GetPixelColor(x As Integer,y as integer)as color
    11. Dim hdc As IntPtr = GetWindowDC(IntPtr.Zero)
    12. Dim cl As Color = Color.FromArgb(CType(GetPixel(hdc, x, y), Integer))
    13. ReleaseDC(IntPtr.Zero, hdc)
    14. Return cl
    15. End Function
    16. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    17. 'Vermutlich muss ich hier etwas wie "GetPixelColor(Cursor.Position.X, Cursor.Position.Y)" reinschreiben....
    18. 'verzeih mir meine Dummheit, aber ich verstehe den Befehl "Return cl"
    19. 'ein paar Zeilen weiter oben einfach noch nicht ganz bzw. nicht, wie er wirkt -.-
    20. 'Zum Schluss sollte z.B. eine Msgbox den Farbwert verkünden...
    21. End Sub
    22. End Class



    Hoffe auf viiiiiel Geduld ;) ...
    Ich weiß mich ob man es so kompliziert machen muss, aber wenn ich deine Frage richtig vertehe würde dieser Code funktionieren:
    Du brauchst eine Picturebox (PictureBox1), einen Timer (Timer1) und ein Label (Label1).

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. PictureBox1.Image = ScrCpt(Cursor.Position.X, Cursor.Position.Y, 20, 20)
    3. Dim BitMp1 As New Bitmap(PictureBox1.Image)
    4. Dim Pix1 As Color = BitMp1.GetPixel(1, 1)
    5. Label1.BackColor = Pix1
    6. End Sub
    7. Public Function ScrCpt(ByVal X As Integer, ByVal Y As Integer, ByVal Height As Integer, ByVal Width As Integer) As Bitmap
    8. Dim b As New Bitmap(Width, Height)
    9. Dim g As Graphics = Graphics.FromImage(b)
    10. g.CopyFromScreen(X, Y, 0, 0, b.Size)
    11. g.Dispose()
    12. Return b
    13. End Function


    mfG Splamy
    Eigentlich ganz gut ;) Vielleicht habe ich mich auch ein wenig falsch ausgedrückt, aber ich hätte gerne den FarbWERT, also eine Zahl wie z.B. 0 oder 23123317 ...
    "Label1.BackColor = Pix1" müsste eben umgeformt werden. Problem ist eben nur, dass Pix1 kein String sondern System.Drawing.Color ist...
    Dein vorheriger Code war richtig, da "GetPixelColor" eine Function ist, gibt sie einen Wert zurück.
    Durch Function... As Color weißt du, dass die Function einen Color-Wert zurückgibt, nämlich (Return cl) cl, der in der Function berechnet wird.
    Ein Codebeispiel für die Messagebox wäre dies:

    VB.NET-Quellcode

    1. Messagebox.show(cl.R & ", " & cl.G & ", " & cl.B)
    Danke! Hab's jetzt einigermaßen kapiert... hatte nicht gepeilt, dass eine Variable des Typs "Color" als .R oder .G oder .B angesprochen werden muss. Und die Zahl, die ich von AutoIT GetPixelColor() gewohnt war, war einfach .R, .G und .B aneinandergehängt ;) Zwar noch komisch, dass VB und AutoIT für den selben Pixel unterschiedliche Zahlenwerte rausbekommen, aber naja, ich werds schon schaffen =) Vielen Dank an alle, die mir geantwortet haben!!