Farbe eines Pixels auf dem Bildschirm ermitteln?
Kann ich mithilfe von CMD oder so die Farbe eines Pixels auf dem Bildschirm bestimmen? Mir schwebt so etwas vor:
move Maus to: pixel(#000000)[0]
Also die Maus zum ersten gefundenen Pixel mit der Farbe Schwarz bewegen.
Geht das?
4 Antworten
ja, das geht... also, zumindest Windows bietet solche Schnittstellen um das auszulesen
die werden z.B. für Fernwartungs-Software genutzt
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 ...
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.
- https://stackoverflow.com/questions/22904069/c-sharp-how-to-get-pixel-color-data-from-the-screen
- https://social.msdn.microsoft.com/Forums/vstudio/en-US/f69be6e3-0b21-4ae7-a66b-ebe73ad951a4/is-there-anything-faster-than-getpixel?forum=clr
- https://stackoverflow.com/questions/17130138/fastest-way-to-get-screen-pixel-color-in-c-sharp
- https://docs.microsoft.com/en-us/windows/win32/opengl/glreadpixels
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...😉
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.
Ich denke die Frage war eher gedacht nach dem "wie" :) Würde mich auch interessieren...