Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Auf farbveränderungen in anderen programmen reagieren (https://www.delphipraxis.net/76098-auf-farbveraenderungen-anderen-programmen-reagieren.html)

ghost007 29. Aug 2006 22:58


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

_frank_ 30. Aug 2006 09:56

Re: Auf farbveränderungen in anderen programmen reagieren
 
kleines Beispiel programm ;)

Delphi-Quellcode:
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;
statt der cursorposition kannst du natürlich auch andere Koordinaten nehmen. (siehe auch die auskommentierte funktion zur Bestimmung der Fensterposition/Größe).

//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

ghost007 30. Aug 2006 11:59

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

ghost007 30. Aug 2006 12:21

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

_frank_ 30. Aug 2006 12:28

Re: Auf farbveränderungen in anderen programmen reagieren
 
du rufst die funktion GetScreenRect z.B. so auf:

Delphi-Quellcode:
r:=rect(10,10,20,20); //rechteck innerhalb des fensters
r:=GetScreenRect(true,'Delphi',r);//delphi ist der text in der titelzeile des fensters
nun stehen in r die absoluten Koordinaten ;)
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:
GetCursorPos(p);
label1.caption:=InttoStr(p.x)+','+IntToStr(p.y);
Gruß Frank

ghost007 30. Aug 2006 12:33

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

_frank_ 30. Aug 2006 12:40

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

ghost007 30. Aug 2006 13:00

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]

ghost007 30. Aug 2006 14:05

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:

Undeclared Identifier: 'p'
[EDIT]
hat sich erledigt
[/EDIT]

ghost007 30. Aug 2006 20:59

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.
Seite 1 von 2  1 2      

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