Meine "extremen" Äusserungen von mir basieren nur darauf dass dieser legacy vs expression Mode Mist mit abstand das unnötigste ist, was eine Programmiersprache haben kann.
Von sich im laufe der Versionen ändernder Syntax ganz zu schweigen.
So langsam habe ich mal eine AHnung wie manches in AHk v1 funtkioniert. Da will ich eigentlich nicht noch eine neue Sorache lernen.
Schlimm genug dass man mit dem expression vs legacy Mist so schon 2 befehlssätze lernen muss und durch himmlische Eingebung (oder Wiki) wissen muss welcher befehl oder Funktion welchen modus erwartet.
Und ja, jede andere Sprache wie java, python, C, etc. ist da einfach besser, die haben den Müll nicht.
Da hat eine zuweisung bspw. die Form int a=5; und fertig.
Da gibts nicht den Mist wo ein Programm völlig was anderes tut weil irgendwo ein anderer Modus erwartet wird von einer Funktion.
Im Prinzip frage ich mich nur, wie betrunken der Erfinder der Sprache gewesen sein muss als er die 20 verschiedenen Schreibvarianten für gut befunden hat. Scheinbar nicht viel.
Kannst du auch wieder einordnen.
Geht übrigens nicht um unter meienr Würde, sosnt würde ich ja nciht shcon ewig an einem AHK Script werkeln.
Was nicht heißt dass ich den legacy vs expression Mode Kram einfach nur sche*ße finde! Braucht kein Mensch.
Aber egal.
Zum Code:
Code: Select all
GetResultColor(){
;MsgBox,,,% "GetResultColor()",2
cr:=0
cs:=0
cz:=0
Sleep 600
Loop,40{
Sleep, 80
;do Color Search on ( 823,340)
colour:=PixelColorSimple(chromeid, 1000,340)
;do SingleTestColor(colour)
L:=SingleTestColor(colour)
;depending on result increase cr cs or cz by 1
Switch L
{
Case "R":
cr:=cr+1
Case "S":
cs:=cs+1
Case "Z":
cz:=cz+1
}
}
result:="R"
;depending on which one is the biggest return R S or Z
/*
if(cr>cs)&&(cr>cz){
result:="R"
}
if(cs>cr)&&(cs>cz){
result:="S"
}
if(cz>cs)&&(cz>cr){
result:="Z"
}
*/
if(cr>8){
result:="R"
}
if(cs>8){
result:="S"
}
if(cz>8){
result:="Z"
}
MsgBox,,,% "cr=" . cr . "cs=" . cs . "cz=" . cs . "Color Result is " . result,5
return result
/*
#Persistent
CoordMode Pixel, Screen
CoordMode Mouse, Screen
SetTimer, WatchCursor, 100
return
;changed to watching the testpixel nonstop
WatchCursor:
;MouseGetPos X, Y
;PixelGetColor Color, %X%, %Y%, RGB
a:=PixelColorSimple(chromeid, 823,340)
ToolTip, %a% %X% %Y%
*/
}
; Coordinates are related to the window's client area (false, is using screen coordinates from (0,0) to (1919,1079))
PixelColorSimple(pc_wID, pc_x, pc_y) {
if (pc_wID) {
pc_hDC := DllCall("GetDC", "UInt", pc_wID)
pc_fmtI := A_FormatInteger
SetFormat, IntegerFast, Hex
pc_c := DllCall("GetPixel", "UInt", pc_hDC, "Int", pc_x, "Int", pc_y, "UInt")
pc_c := pc_c >> 16 & 0xff | pc_c & 0xff00 | (pc_c & 0xff) << 16
pc_c .= ""
SetFormat, IntegerFast, %pc_fmtI%
DllCall("ReleaseDC", "UInt", pc_wID, "UInt", pc_hDC)
pc_c := "0x" SubStr("000000" SubStr(pc_c, 3), -5)
return pc_c
}
}
;depending on the color search result, find the kind of number that was just played
SingleTestColor(colour){
R:=SubStr(colour, 3, 1)
G:=SubStr(colour, 5, 1)
B:=SubStr(colour, 7, 1)
;R=Red,S=Schwarz,N=normal,Z=Null
if(R=8){
return "R"
}
else if(R=1){
return "S"
}
else if(R=0){
return "N"
}
else{
return "Z"
}
}
Was passiert:
Zu einem bestimmten Zeitpunkt während der Laufzeit des Skriptes wird die Funktion GetResultColor aufgerufen.
Letztlich habe ich eine Internetseite mit einem Pixel, das ich beiobachte und das in dem zeitraum die Farbe wechselt.
Welche Farbe es in der Zeit annimmt, will ich letztlich rausfinden.
Dazu bestimme ich in der zeit so alle paar Milisekunden die Farbe des Pixels, machd as so 30 mal hintereinander.
Und wenn bspw. mindestens 15 mal rot gemessen wurde, kann man eben davon ausgehen dass es in der Zeit rot war.
Grundsätzlich hat das pixel immer eine , sich nur leicht, verändernde Standardfarbe.
In der Zeit hingegen kann es für 1-2 Sekunden jedoche entweder rot, schwarz oder grün werden.
Welche der 3 Farben es in der Zeit angenommen hat, ist rauszufinden.
Dazu nehme ich wie gesagt alle paar Millisekunden ne Farbstichprobe und das wa mit Abstand am Öftesten gemsessen wurde, das war dann wohl die erschienene Farbe
Zur Farberkennung konkret:
Die Funktion PixelColorSImple habe ich hier irgendwo aus dem Forum, ich habe nicht mal ansatzweise eine Ahnung was es genau tut.
Aber es scheint zu funktionieren.
Ich gehe alsoi bei jeder meiner 30 Sticjhproben hin, bestimme erst die Hex Darstellung der Pixelfarbe und werfe das dann in die SingleTestColor funktion, die mir letztlich die hexdarstellung in eine Farbe rot, schwarz und so übersetzt (zero steht für null, weil die, wenn sie auftaucht, eben die farbe grün hat).
jedenfalls bildet die funktion die hexdarstellung auf eine der 3 zu erwartenenden farben ab.
Woher ich weiß welche farbe welchen hexcode hat?
Genau gar nicht, aber ich hatte vorab, indem dauernd die farbe unter dem mauszeiger zurückgegeben wird, eben beobachtet dass bspw. wennn das pixel rot ist, die hexdarstellung die form 0x08.... hat. also die erste komponente immer 8 ist.
rest hintne kann sein was es will, schwankt auch mal um +1 oder -1, aber die eine komponente ist so gut wie immer 8 wenn die pixelfarberot ist.
Ähnliche beobahctungen habe ich auch für die anderen Farben gemacht.
So auf die art soll das funktionieren.
Nur bestimmt er mir manchmal schwarz wenn da eigentlich rot ist und ähnliches, weiß noch nicht warum dies so ist.
vermutlich müsste ich da einfach mal meine farbwerte prüfen, vll. gucke ich auch auf die falsche komponente oder so.
habe mir da noch keine tief durchdachten plan für die farberkennung überlegt, bisher funktionierte das skript wegn dem thema mit dem globalen und so nicht.
Übrigens, die erforderliche chrome id oben ist nun, wie vieles Andere auch, nun superglobal, also auf jeden Fall von überall aus lesbar und änderbar
Meine "extremen" Äusserungen von mir basieren nur darauf dass dieser legacy vs expression Mode Mist mit abstand das unnötigste ist, was eine Programmiersprache haben kann.
Von sich im laufe der Versionen ändernder Syntax ganz zu schweigen.
So langsam habe ich mal eine AHnung wie manches in AHk v1 funtkioniert. Da will ich eigentlich nicht noch eine neue Sorache lernen.
Schlimm genug dass man mit dem expression vs legacy Mist so schon 2 befehlssätze lernen muss und durch himmlische Eingebung (oder Wiki) wissen muss welcher befehl oder Funktion welchen modus erwartet.
Und ja, jede andere Sprache wie java, python, C, etc. ist da einfach besser, die haben den Müll nicht.
Da hat eine zuweisung bspw. die Form int a=5; und fertig.
Da gibts nicht den Mist wo ein Programm völlig was anderes tut weil irgendwo ein anderer Modus erwartet wird von einer Funktion.
Im Prinzip frage ich mich nur, wie betrunken der Erfinder der Sprache gewesen sein muss als er die 20 verschiedenen Schreibvarianten für gut befunden hat. Scheinbar nicht viel.
Kannst du auch wieder einordnen.
Geht übrigens nicht um unter meienr Würde, sosnt würde ich ja nciht shcon ewig an einem AHK Script werkeln.
Was nicht heißt dass ich den legacy vs expression Mode Kram einfach nur sche*ße finde! Braucht kein Mensch.
Aber egal.
Zum Code:
[code]
GetResultColor(){
;MsgBox,,,% "GetResultColor()",2
cr:=0
cs:=0
cz:=0
Sleep 600
Loop,40{
Sleep, 80
;do Color Search on ( 823,340)
colour:=PixelColorSimple(chromeid, 1000,340)
;do SingleTestColor(colour)
L:=SingleTestColor(colour)
;depending on result increase cr cs or cz by 1
Switch L
{
Case "R":
cr:=cr+1
Case "S":
cs:=cs+1
Case "Z":
cz:=cz+1
}
}
result:="R"
;depending on which one is the biggest return R S or Z
/*
if(cr>cs)&&(cr>cz){
result:="R"
}
if(cs>cr)&&(cs>cz){
result:="S"
}
if(cz>cs)&&(cz>cr){
result:="Z"
}
*/
if(cr>8){
result:="R"
}
if(cs>8){
result:="S"
}
if(cz>8){
result:="Z"
}
MsgBox,,,% "cr=" . cr . "cs=" . cs . "cz=" . cs . "Color Result is " . result,5
return result
/*
#Persistent
CoordMode Pixel, Screen
CoordMode Mouse, Screen
SetTimer, WatchCursor, 100
return
;changed to watching the testpixel nonstop
WatchCursor:
;MouseGetPos X, Y
;PixelGetColor Color, %X%, %Y%, RGB
a:=PixelColorSimple(chromeid, 823,340)
ToolTip, %a% %X% %Y%
*/
}
; Coordinates are related to the window's client area (false, is using screen coordinates from (0,0) to (1919,1079))
PixelColorSimple(pc_wID, pc_x, pc_y) {
if (pc_wID) {
pc_hDC := DllCall("GetDC", "UInt", pc_wID)
pc_fmtI := A_FormatInteger
SetFormat, IntegerFast, Hex
pc_c := DllCall("GetPixel", "UInt", pc_hDC, "Int", pc_x, "Int", pc_y, "UInt")
pc_c := pc_c >> 16 & 0xff | pc_c & 0xff00 | (pc_c & 0xff) << 16
pc_c .= ""
SetFormat, IntegerFast, %pc_fmtI%
DllCall("ReleaseDC", "UInt", pc_wID, "UInt", pc_hDC)
pc_c := "0x" SubStr("000000" SubStr(pc_c, 3), -5)
return pc_c
}
}
;depending on the color search result, find the kind of number that was just played
SingleTestColor(colour){
R:=SubStr(colour, 3, 1)
G:=SubStr(colour, 5, 1)
B:=SubStr(colour, 7, 1)
;R=Red,S=Schwarz,N=normal,Z=Null
if(R=8){
return "R"
}
else if(R=1){
return "S"
}
else if(R=0){
return "N"
}
else{
return "Z"
}
}
[/code]
Was passiert:
Zu einem bestimmten Zeitpunkt während der Laufzeit des Skriptes wird die Funktion GetResultColor aufgerufen.
Letztlich habe ich eine Internetseite mit einem Pixel, das ich beiobachte und das in dem zeitraum die Farbe wechselt.
Welche Farbe es in der Zeit annimmt, will ich letztlich rausfinden.
Dazu bestimme ich in der zeit so alle paar Milisekunden die Farbe des Pixels, machd as so 30 mal hintereinander.
Und wenn bspw. mindestens 15 mal rot gemessen wurde, kann man eben davon ausgehen dass es in der Zeit rot war.
Grundsätzlich hat das pixel immer eine , sich nur leicht, verändernde Standardfarbe.
In der Zeit hingegen kann es für 1-2 Sekunden jedoche entweder rot, schwarz oder grün werden.
Welche der 3 Farben es in der Zeit angenommen hat, ist rauszufinden.
Dazu nehme ich wie gesagt alle paar Millisekunden ne Farbstichprobe und das wa mit Abstand am Öftesten gemsessen wurde, das war dann wohl die erschienene Farbe :-)
Zur Farberkennung konkret:
Die Funktion PixelColorSImple habe ich hier irgendwo aus dem Forum, ich habe nicht mal ansatzweise eine Ahnung was es genau tut.
Aber es scheint zu funktionieren.
Ich gehe alsoi bei jeder meiner 30 Sticjhproben hin, bestimme erst die Hex Darstellung der Pixelfarbe und werfe das dann in die SingleTestColor funktion, die mir letztlich die hexdarstellung in eine Farbe rot, schwarz und so übersetzt (zero steht für null, weil die, wenn sie auftaucht, eben die farbe grün hat).
jedenfalls bildet die funktion die hexdarstellung auf eine der 3 zu erwartenenden farben ab.
Woher ich weiß welche farbe welchen hexcode hat?
Genau gar nicht, aber ich hatte vorab, indem dauernd die farbe unter dem mauszeiger zurückgegeben wird, eben beobachtet dass bspw. wennn das pixel rot ist, die hexdarstellung die form 0x08.... hat. also die erste komponente immer 8 ist.
rest hintne kann sein was es will, schwankt auch mal um +1 oder -1, aber die eine komponente ist so gut wie immer 8 wenn die pixelfarberot ist.
Ähnliche beobahctungen habe ich auch für die anderen Farben gemacht.
So auf die art soll das funktionieren.
Nur bestimmt er mir manchmal schwarz wenn da eigentlich rot ist und ähnliches, weiß noch nicht warum dies so ist.
vermutlich müsste ich da einfach mal meine farbwerte prüfen, vll. gucke ich auch auf die falsche komponente oder so.
habe mir da noch keine tief durchdachten plan für die farberkennung überlegt, bisher funktionierte das skript wegn dem thema mit dem globalen und so nicht.
Übrigens, die erforderliche chrome id oben ist nun, wie vieles Andere auch, nun superglobal, also auf jeden Fall von überall aus lesbar und änderbar :-)