![]() |
Auf farbveränderungen in anderen programmen reagieren
Hallo,
ich frage mich folgendes. Wir nehmen einmal an ich hab ein programm das an einer bestimmten stelle im fenster einen runden kreis hat, der entweder rot oder grün ist, je nach programm status. Jetzt will ich ein programm schreiben, welches per timer z.B. alle 5 sekunden schaut welche farbe der kreis hat, oder der mittelpunkt des kreises, und dann demensprechend reagiert. Ist so etwas möglich? Wenn ja, wo sollte ich ansetzten, wie macht man sowas? Danke schon mal MfG - Ghost |
Re: Auf farbveränderungen in anderen programmen reagieren
kleines Beispiel programm ;)
Delphi-Quellcode:
statt der cursorposition kannst du natürlich auch andere Koordinaten nehmen. (siehe auch die auskommentierte funktion zur Bestimmung der Fensterposition/Größe).
var
Form1: TForm1; FHdc:HDC; implementation {$R *.DFM} (* //funktion zum prüfen, ob fenster sichtbar function WindowVisible(Caption:string):boolean; var r:TRect; hwnd:THandle; begin result:=false; if (Caption<>'') then begin hWnd:=FindWindow(nil,PCHAR(Caption)); //handle des fensters, 0=nicht gefunden if hWnd<>0 then if isWindowVisible(hWnd) then //winapi zum prüfen, ob sichtbar if GetWindowRect(hWnd,r) then //fensterposition holen //prüfen ob sichtbar (u.a. position in sichtbereich, muss ggf. angepasst werden) if (r.top>-50) and (r.Left>-50) and (r.Left<>r.Right) then result:=true; end; end; //bei relativen (fensterabhängigen) positionen, das fenster-Rechteck holen, //und die relativen werte in Absolute umrechnen //FRelativePosition = relativ zu einem fenster ja/nein //FWindowTitle = Fenstertitel //srcRect = definiertes rechteck (relative position) function GetScreenRect(FRelativePosition:boolean;FWindowTitle:string;srcRect:TRect):TRect; var r:TRect; begin r:=srcRect; //r initialisieren //wenn koordinaten relativ sein sollen (funktionsparameter) und das durch FWindowTitle if (FRelativePosition) and (WindowVisible(FWindowTitle)) then begin //fensterposition/größe holen GetWindowRect(Findwindow(nil,PCHAR(FWindowTitle)),r); //absolute position berechnen r.Left:=FselRect.Left+r.left; r.Top:=FselRect.Top+r.Top; r.right:=r.left+(FSelRect.right-FSelRect.Left); r.bottom:=r.top+(FSelRect.Bottom-FSelRect.Top); end; result:=r; end; *) function GetScreenPixel(x,y:integer):TColor; begin //den farbwert der angegebenen position auf dem bildschirm ermitteln result:=GetPixel(FHdc,x,y); end; procedure TForm1.FormCreate(Sender: TObject); begin //Handle des Bildschirmcanvas holen FHdc:=GetDC(0); end; procedure TForm1.Button1Click(Sender: TObject); var p:TPoint; begin //aktuelle Cursorposition holen und in p speichern GetCursorPos(p); //meine funktion aufrufen, die cursorposition mitgeben und den //Rückgabewert der color-eigenschaft des forms zuweisen color:=GetScreenPixel(p.x,p.y); end; //kommentare hinzugefügt und getScreenRect etwas verändert, sowie fehlende Funktion zu Prüfen der Sichtbarkeit hinzugefügt //ich hoffe, die kommentare helfen weiter ;) HTH Frank |
Re: Auf farbveränderungen in anderen programmen reagieren
Danke für deine antwort.
Da ich aber seit längerer Pause wieder delphi programmiere, blick ich den quellcode nich so. Könntest du vielleicht ein paar Kommentare einfügen? MfG - Ghost |
Re: Auf farbveränderungen in anderen programmen reagieren
wenn ich das so sagen darf.
DU bist genial :thumb: Ich befass mich jetzt erst mal mit den auskomentierten funktionen. Aber 1 frage hätte ich noch, wie komm ich an die koordienaten in dem anderen fester/programm? gibt es die möglich keit mir die maus koordinaten anzeigen zu lassen? MfG - Ghost |
Re: Auf farbveränderungen in anderen programmen reagieren
du rufst die funktion GetScreenRect z.B. so auf:
Delphi-Quellcode:
nun stehen in r die absoluten Koordinaten ;)
r:=rect(10,10,20,20); //rechteck innerhalb des fensters
r:=GetScreenRect(true,'Delphi',r);//delphi ist der text in der titelzeile des fensters wenn z.B. das fenster 'Delphi' an position 100,100 ist (bildschirmkoordinaten), stünde in r am Ende rect(110,110,120,120) zu 2.
Delphi-Quellcode:
Gruß Frank
GetCursorPos(p);
label1.caption:=InttoStr(p.x)+','+IntToStr(p.y); |
Re: Auf farbveränderungen in anderen programmen reagieren
die zahlen in klammern hinter dem "rect" legen die größe des rechtecks fest, von dme die koordinaten genommen werden, oder?
MfG - Ghost |
Re: Auf farbveränderungen in anderen programmen reagieren
erst werden dem r die korrdinaten des (relativen) rechtecks zugewiesen (die zahlen in der klammer (left,top,right,bottom)) siehe hilfe zur rect-funktion.
diese koordinaten werden der Funktion GetScreenRect übergeben, welche die absolute (bildschirm-) Position daraus errechnet und zurückgibt. Diese Funktionsrückgabe wird wieder r zugewiesen. das meintest du doch, oder? :gruebel: Gruß Frank |
Re: Auf farbveränderungen in anderen programmen reagieren
genau das :)
danke Hab jetzt dann erstma was zu tun :-D Werd ma alles was du gepostet hast checken und versuchen zu verstehen. MfG - Ghost [EDIT] Ich hab in dem anderen programm einen roten balken, der je nach verstrichener zeit grau wirt, also wie ne progressbar erst rot dann von rechts nach links grau, bis er schließlich ganz grau ist. Wie kann ich testen wann er ganz grau ist? nehm ich da am besten den pixel ganz links und schau wann der grau is, oder gibts ne bessere lösung? [/EDIT] |
Re: Auf farbveränderungen in anderen programmen reagieren
zu deiner mauspositions funktion:
von welcher art muss die variable p sein? da kommt bie mir volgender fehler: Zitat:
hat sich erledigt [/EDIT] |
Re: Auf farbveränderungen in anderen programmen reagieren
Also,
ich weiß nun an welchen koordinaten ich die farbe hole. Blos die farbe ist fast jedes mal wenn ich sie hole ein kleine wenig anders d.h. ein wenig heller oder ein wenig dunkler. Damit ich sie aber abgleichen kann, müsste sie immer gleich sein. Um das problem zu lösen hab ich mir überlegt, das ich mir den rot anteil aus der farbe suche und dann für einen bestimmten bereich an rotanteilen dann die funktion freigebe. Nun meine frage: Wie komme ich an den rotanteil in einer farbe MfG - Ghost |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz