Farbe eines Pixels auf dem Bildschirm ermitteln?

4 Antworten

ja, das geht... also, zumindest Windows bietet solche Schnittstellen um das auszulesen

die werden z.B. für Fernwartungs-Software genutzt


Jel82  10.03.2021, 10:25

Ich denke die Frage war eher gedacht nach dem "wie" :) Würde mich auch interessieren...

0
meirumeiru  10.03.2021, 10:36
@Jel82

also, mit GDI (hab noch nicht geschaut, wie's mit DirectX geht, aber das muss auch gehen, weil GDI ja nur noch ein Wrapper ist) geht's mit

GetDC(NULL) und dann BitBlt von diesem DC in einen eigenen (compatible) DC ...

0

Ich denke mal das Ganze läuft auf einen Klickbot hinaus, welcher auf einen Button mit definierter Farbe klicken soll?

Theoretisch machbar, aber nicht mit purem Batch. Da muss schon C# ran.

Theoretisch macht man einen Screenshot eines Pixels und wertet die Farbe aus.

Die letzten zwei Links zeigen auch gleich die Fallstricke.

Erstmal muss man mit einem geeigneten Algorithmus den Bildschirm scannen. das braucht Zeit. Im günstigsten Fall macht man eine Aufnahme eines eingegrenzten Bereiches und sucht das entstehende ByteArray nach dem gewünschten Bytemuster ab, dabei wird stur der Bereich von Linksoben nach Rechtsunten Zeilenweise erfasst. Ansonsten muss man ordentlich Aufwand treffen um irgendwie "ringförmig" von der Mitte ausgehend einzeln Pixel zu prüfen.(enorm Zeitintensiv)

Der dritte Link zeigt einen Weg die Sache mit DirektX der Hardware zu überlassen. Letztlich auch nicht wirklich toll, da der Framebuffer nicht zwangsläufig das enthält was auf dem Bildschirm aktuell sichtbar ist.

Aber auch Glreadpixels ist tückisch. Besonders bei Spielen kann ein Pixel auch noch eine Tiefenkomponente haben und verschiedene Farbformate (RGB,RGBA,BRG,BRGA oder gar Color/Luma(A)) aufweisen. Hinzu kommt das Werte in OpenGL in der Regel als Kommazahl zwischen 0 und 1 dargestellt werden und somit im ungünstigen Fall eine Umrechnung auf 3 8bitwerte nicht unbedingt den angestrebten RGB-Wert enthalten. Wird der Zeitgewinn durch die Arbeit der Pixelshader durch das aufwendige umrechnen jedes Pixels wieder aufgefressen.

Egal der Aufwand ist einfach zu groß.

Die Maus auf eine Bildschirmposition klicken zu lassen ist mit Batch-Powershell-.Net-Hybrid PillePalle:

Klick.cmd

<# : batch portion
@echo off 
  rem.||(
    Bisher definierte KlickTypen:
    LClick:  Linksklick
    RClick:  Rechtsklick
    MClick:  Mittelclick
    LDClick: Linker Doppelklick
  )
  rem Position  50,30 von der linken oberen Ecke , linker Doppelklick
call :mouseClick 50 30 LDClick
  rem warte 3 sekunden
timeout 3 >nul
  rem Position  700,500 von der linken oberen Ecke , rechtsKlick
call :mouseClick 700 500 RClick
exit /b

:mouseClick
powershell -noprofile "$PX=%~1;$PY=%~2;$CT='%~3'; iex (${%~f0} | out-string)"
exit /b
: end batch / begin powershell #>

Add-Type -AssemblyName System.Windows.Forms 
Add-Type -Memberdefinition '[DllImport("user32.dll")]public static extern void mouse_event(int dwFlags,int dx,int dy,int dwData,int dwExtraInfo);' -Namespace Tools -Name Mouse

$pos = new-object System.Drawing.Point $PX,$PY
[System.Windows.Forms.Cursor]::Position = $pos

switch ( $CT ) {
    'LClick'    {   [Tools.Mouse]::mouse_event(6,0,0,0,0) ; break}
    'RClick'    {   [Tools.Mouse]::mouse_event(24,0,0,0,0); break}
    'MClick'    {   [Tools.Mouse]::mouse_event(24,0,0,0,0); break}
    'LDClick'   {     #generiere linken Doppelklick 2 mal in Folge LEFTDOWN+LEFTUP mit eienem Abstand  von 10 Millisekunden
                    [Tools.Mouse]::mouse_event(6,0,0,0,0)
                    Sleep -m 10
                    [Tools.Mouse]::mouse_event(6,0,0,0,0) ; break}
}

  #https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event
  #Die Positionsparameter dx,dy,dwData,dwExtraInfo sind unerheblich für Klickevents (bleiben einfach alle 0)
  #Klickevents können addiert werden 2+4=6=Linksklick etc.
  <#    LEFTDOWN   =  2
        LEFTUP     =  4
        RIGHTDOWN  =  8
        RIGHTUP    = 16
        MIDDLEDOWN = 32
        MIDDLEUP   = 64
  #>

Ich weiß ja nicht was Du vorhast, aber ein Pixel einer bestimmten Farbe zu suchen um darauf zu klicken ist garantiert der falsche Ansatz. Verrenne Dich da nicht in eine falsche Idee. Die meisten Programmieranfänger sind zusehr der bunten Oberfläche verhaftet. (man muss hierhin Klicken und jenes Menü offnen und den 3. Menüpunkt auswählen)

K💩cke... das ist alles nur für Leute, die ohne Vorwissen etas bedienen wollen.

Das wesentliche passiert unter der Oberfläche...

Nichtmal ein Anfänger käme auf die absurde Idee mit einer Batch/Programm per Mausklick den Editor zu starten und dann per Tastatursimulation (Sendkey) etwas in eine Datei schreiben zu lassen...🤣 Klar machbar... mit 100 Zeilen Code... statt dessen schreibt ein Befehl etwas in die Datei, ohne Klicken und Senden... :

echo  bla und blubb mit laberrhababer >test.txt

...oder man schriebt eine Fernsteuerung für eine Webseite https://www.gutefrage.net/frage/koennt-ihr-den-fehler-in-dem-powershell-script-finden-der-sohn-meines-freundes-hat-mich-gefragt-und-ich-bin-ueberfordertdanke-im-vorraus#answer-391141564

oder schickt der Webseite noch bequemer direkt die nötigen Daten (wenn dies über die Adresszeile möglich ist:

start "" https://www.google.com/search?q=rosa+Einhörner

Man muss den Suchbegriff nicht in das Suchfeld eintragen... Man muss nur wissen in welcher Form man etwas übermittelt.

Natürlich geht das bei Spielen nicht so einfach. Die Hersteller geben sich nicht umsonst Mühe Cheats zu unterdrücken...

Einen Bot zu programmieren , der eine Bildanalyse durchführt wäre eine Lösung. Da Du sowas jedoch nicht selbst programmieren kannst müsste das jemand für Dich tun. Das ist Auftragsarbeit , welche niemand für Lau tut...

Vielleicht solltest Du wie es wohl angedacht ist von Hand klicken...😉

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Hm... wofür brauchst Du das denn? Das geht sicher auch anders, oder?

Ich kann mir nicht vorstellen, dass die Eingabeaufforderung bzw. PowerShell so etwas kann. Eine externe Software kann das aber bestimmt.

Woher ich das weiß:eigene Erfahrung – Ich interessiere mich schon sehr lange für Computer