1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

vb 08 Pixel veränderung bemerken

Discussion in 'Programmieren' started by Proggiiii, Mar 3, 2009.

Thread Status:
Not open for further replies.
  1. Proggiiii

    Proggiiii Byte

    Hallo,
    ich sitze an einem Programm, es soll aus einem anderen Programm z.B. das Pixel 50,50 beachten sollte sich die Farbe auf #ff0000 oder die, die ich halt angebe ändern soll das Programm das und das machen. Nur wie kann man das machen das mein Programm dieses Pixel beobachten und dies macht. Einen Timer der alle paar Millisec. prüft. Und dann wie mach ich die prüfung ob dieses Pixel diese Farbe angenommen hat???
     
  2. tetrododoxin

    tetrododoxin Kbyte

    Du müsstest Dir zunächst einmal das Window-Handle des anderen Programms besorgen, sofern dieses ein Fenster besitzt.
    Dann kannst Du mit diesem HWND den DeviceContext (API: GetDC(HWND) ) holen und anschließend die API-Funktion GetPixel() verwenden.
     
  3. daboom

    daboom Megabyte

    Ich glaube, das war aber nicht die Frage, oder?

    Ich hab's so verstanden, dass der TO gerne den "Status" (also den Farbwert) eines einzelnen Pixels überwachen möchte und eine Aktion ausführen, wenn sich dieser ändern.

    Wenn es nicht irgendeinen Callback-Mechanismus gibt, in den man sich da reinhängen kann (kenn mich nicht so gut mit der Win-API aus), geht's wohl bloß über Polling (also wie schon geschrieben mit Timer usw.).
     
  4. Proggiiii

    Proggiiii Byte

    ja genau so will ich es. Nur wie shcaff ich es das dies überwacht wird???
     
  5. kazhar

    kazhar Viertel Gigabyte

    eigentlich steht in #2 genau die methode der wahl.

    1. das handle des fensters z.b. per EnumChildWindows und zugehöriger callback funktion ermitteln
    2. den devicekontext des fensters per GetDC ermitteln
    3. die pixelfarbe per GetPixel abfragen.
    4. den ermittelten farbwert auswerten

    das ganze per timer alle z.b. 200 ms anstoßen
     
  6. tetrododoxin

    tetrododoxin Kbyte

    Jap, ich hatte nur noch erklärt, wie er an den farbwert des Pixels kommt, da er das Prinzip mit dem Timer bereits selbst erwähnt hatte.
     
  7. kazhar

    kazhar Viertel Gigabyte

    mich hat nur die meldung in #3 gewundert...

    man könnte natürlich auch einen msg hook in das zu überwachende programm einhängen und die paint nachricht für das entsprechende fenster abfangen/auswerten. ob der zusätzliche aufwand allerdings lohnt?
     
  8. daboom

    daboom Megabyte

    Solange die Möglichkeit besteht, würde ich persönlich sowas immer über ein Callback- bzw. Listenerkonzept lösen.

    1. Mache ich dann nur genau zu der Zeit etwas, wo es nötig ist. (Beispiel ich taste alle 200 ms ab und es passiert 10 sek lang nix)
    2. Verpasse ich nix, wenn mal häufiger etwas passiert, als ich es erwarte (Beispiel: Ich taste alle 200 ms ab und es passieren zwei Änderungen im 50 ms Intervall)

    Wie gesagt, ich kenn mich mit WinAPI Programmierung nicht so gut aus, daher eweiß ich jetzt nicht genau, wie kompliziert die eine oder andere Lösung wäre...
     
  9. kazhar

    kazhar Viertel Gigabyte

    ich hab mich mal mit der sache "gespielt". prinzipiell funktoniert die getpixel geschichte, allerdings gibt es probleme mit verdeckten fensterbereichen (anderes fenster schwebt über dem auszulesenden fenster -> ein button ist auch ein fenster!). da versagt die methode grandios und sollte noch überarbeitet werden...

    die hook geschichte funktioniert; allerdings verwende ich den nur als indikator, das irgend ein teil des angepeilten fensters verändert wurde.
     
  10. Proggiiii

    Proggiiii Byte

    Hay,
    nach weiterm Stunden langem googln bin ich auf eine msdn seite gekommen wo ich dieses Code gefunden hab.
    Code:
    Option Strict Off
    Option Explicit On
    Friend Class Form1
        Inherits System.Windows.Forms.Form
        'Beispiel : Mouseposition setzen.
        Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal lXPosition As Long, ByVal lYPosition As Long) As Long
        Private Declare Function GetCursorPos Lib "user32" (ByVal coll As Long) As Long
        Private Declare Function SetCursorPos Lib "user32" (ByVal X As Integer, ByVal Y As Integer) As Integer
    
        Private Sub fMousePositionSetzen(ByRef lXPosition As Integer, ByRef lYPosition As Integer)
            SetCursorPos(lXPosition, lYPosition)
    
        End Sub
    
        Private Sub Button1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Button1.Click
            fMousePositionSetzen(CInt(Label1.Text), CInt(Label2.Text))
            Label1.Text = GetPixel(255, (CInt(Label1.Text)), CInt(Label2.Text))
    
        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
        End Sub
    
        Private Sub Button2_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Button2.Click
            Me.Close()
        End Sub
    
    
        Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click
    
        End Sub
    End Class
    Man muss in Label 1 und Label 2 die Korrdinaten eingeben. Ich denke der Code funktioniert nur wird mir beim klcik auf Button1. eine wilde Zahl an Label 1 angezeigt was ist dies für eine???
     
  11. kazhar

    kazhar Viertel Gigabyte

    die "wilde zahl" wird die colorref des pixels sein (also der rgb-farb-wert)

    musst halt auseinander sortieren: das niederwertigste byte kodieren den rot-wert, das 2. byte den gelb-wert und das 3. byte den grün-wert.
     
Thread Status:
Not open for further replies.

Share This Page