Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pixelfarbe abfragen mit Delphi (https://www.delphipraxis.net/12440-pixelfarbe-abfragen-mit-delphi.html)

LeCorno 27. Nov 2003 13:18


Pixelfarbe abfragen mit Delphi
 
Hallo,
wie kann ich die Farbe eines auf dem Bildschirm sichtbaren Pixels, von dem ich die Koordinaten weiss, abfragen?

Ich will einen bestimmten Bildschirmbereich auf Farbänderungen überwachen, das Delphi Programm soll dabei im Hintergrund laufen.

Habt ihr ne Idee?

Danke für eure Hilfe :coder:

Gruß,
Corny

Kamil 27. Nov 2003 15:23

Re: Pixelfarbe abfragen mit Delphi
 
Vielleicht so:
Delphi-Quellcode:
function GetPixel(Pos: TPoint): TColor;
var
  DC: HDC;
  Handle: HWND;
begin
  Handle:=WindowFromPoint(Pos);
  DC:=GetDC(Handle);
  result:=Windows.GetPixel(DC, Pos.X, Pos.Y);
  ReleaseDC(Handle, DC);
end;
Hab's aber nicht gestestet!

LeCorno 27. Nov 2003 16:59

Re: Pixelfarbe abfragen mit Delphi
 
danke für deine antwort!

die funktion gibt mir nur die farbwerte von pixeln, die auf dem desktop liegen aus. :(
wie kann ich auch pixel in aktiven programmfenstern analysieren ?

gruß
corny

Kamil 27. Nov 2003 19:32

Re: Pixelfarbe abfragen mit Delphi
 
Vielleicht musst du es noch mit ChildWindowFromPoint kombinieren.

LeCorno 27. Nov 2003 19:36

Re: Pixelfarbe abfragen mit Delphi
 
hast du ne idee, wie der quelltext dazu aussehen könnte?

aber danke schonmal :thuimb:

Kamil 27. Nov 2003 19:40

Re: Pixelfarbe abfragen mit Delphi
 
ach, ne... ich glaube du musst die Position (Pos.X und Pos.Y) an das Fenster anpassen (also relative Koordinaten berechnen).

LeCorno 27. Nov 2003 19:50

Re: Pixelfarbe abfragen mit Delphi
 
hmm da bin ich mir nicht sicher.
wenn ich nach dem quellcode vorgehe, den du als erstes gepostet hattest, zeigt das programm mir bei einem pixel in einem aktiven fenster den farbwert '-1'...

-corny :coder:

Kamil 27. Nov 2003 19:54

Re: Pixelfarbe abfragen mit Delphi
 
ich meine es ungefähr so (jetzt müsste es eigentlich funktionieren):
Delphi-Quellcode:
function GetPixel(Pos: TPoint): TColor;
var
  DC: HDC;
  Handle: HWND;
  Rect: TRect;
begin
  Handle:=WindowFromPoint(Pos);
  if GetWindowRect(Handle, Rect) then
  begin
    DC:=GetDC(Handle);
    Pos.X:=Pos.X-Rect.Left;
    Pos.Y:=Pos.Y-Rect.Top;
    result:=Windows.GetPixel(DC, Pos.X, Pos.Y);
    ReleaseDC(Handle, DC);
  end
  else
  begin
    result:=CLR_INVALID;
  end;
  if result=CLR_INVALID then
    raise Exception.Create('Fehler...');
end;
(edit: du könntest auch einfach einen Screenshot erstellen und dort dann die Pixel auslesen...)

LeCorno 27. Nov 2003 20:09

Re: Pixelfarbe abfragen mit Delphi
 
kann das programm jetzt alle pixel, die ich als anwender sehe, abfragen, oder nur die des aktiven fensters?

edit: screenshot schwierig, ich muss ein laufendes programm überwachen...

Kamil 27. Nov 2003 20:29

Re: Pixelfarbe abfragen mit Delphi
 
Alle, die der Anwender sieht. Probier's doch einafch aus...

LeCorno 27. Nov 2003 20:31

Re: Pixelfarbe abfragen mit Delphi
 
hab ich, gibt bei allen pixeln -1 oder den wert für windows-grau aus :|

ich versuche schon, alle mir unbekannten bezeichnungen in deinem code rauszufinden, ist wirklich nicht einfach! respekt für deine leistung und ein riesendanke für deine hilfsbereitschaft :cheers:

Sanchez 27. Nov 2003 20:48

Re: Pixelfarbe abfragen mit Delphi
 
Ich habs gerade ausprobiert. Meistens funktionierts, aber gelegentlich bekomme ich wieder Werte die nicht stimmen können. Inaktive Titelleisten liefern z.B. immer $FFFFFFFF und gelegentlich bekomme ich für Farben ausserhalb des Testprogs auffällig falsche Werte. Hab aber noch kein System dahinter entdecken können.

OLLI_T 27. Nov 2003 21:34

Re: Pixelfarbe abfragen mit Delphi
 
Hallo Leuts!

Vorsicht, Screen und Client-Koordinaten nicht miteinander mixen. Wenn Du / ihr alle Pixel erfassen möchtet, dann reicht es nicht auf den Client Device Kontext des Fenstern zuzugreifen. Daher ist GetDC in diesem Falle der falsche Befehl. Hier mal ein kleines Demo mit zwei Timern. Ich denke es ist selbsterklärend.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
Var Pt:TPoint; DC:HDC; Col:TColorRef; hBr,OldBr:HBrush;
begin
  GetCursorPos(Pt);
  DC:=CreateDC('DISPLAY',NIL,NIL,NIL); // Desktop DC
  Try
    Col:=GetPixel(DC,Pt.x,Pt.y);
    hBr:=CreateSolidBrush(Col);
    OldBr:=SelectObject(Canvas.Handle,hBr);
    Rectangle(Canvas.Handle,10,10,100,100);
  Finally
    SelectObject(Canvas.Handle,OldBr);
    DeleteObject(hBr);
    DeleteDC(DC);
  End;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
Var DC:HDC; Wnd:HWnd; Rect:TRect; Pt:TPoint;
  Col:TColorRef; hBr,OldBr:HBrush;
begin
  GetCursorPos(Pt);
  Wnd:=WindowFromPoint(Pt);
  if GetWindowRect(Wnd, Rect) then begin
    DC:=GetWindowDC(Wnd); // Window DC einschließlich NonClient Area
    Try
      Pt.X:=Pt.X-Rect.Left;
      Pt.Y:=Pt.Y-Rect.Top;
      GetPixel(DC, Pt.X, Pt.Y);
      Label1.Caption:=Format('X:%d; Y:%d',[Pt.x,Pt.y]);
      Col:=GetPixel(DC,Pt.x,Pt.y);
      hBr:=CreateSolidBrush(Col);
      OldBr:=SelectObject(Canvas.Handle,hBr);
      Rectangle(Canvas.Handle,200,10,300,100);
    Finally
      DeleteObject(hBr);
      SelectObject(Canvas.Handle,OldBr);
      ReleaseDC(Wnd, DC);
    End;
  End;
end;
Und an alle Rosinensucher: Ja ich weiss was ein Mousehook ist. :cyclops:

Viele Grüsse

OLLI

LeCorno 28. Nov 2003 07:36

Re: Pixelfarbe abfragen mit Delphi
 
vereinfacht ausgedrückt, liefert

Code:
procedure TForm1.Timer1Timer(Sender: TObject);
Var Pt:TPoint; DC:HDC;
begin
  GetCursorPos(Pt);
  DC:=CreateDC('DISPLAY',NIL,NIL,NIL);
  label1.Caption := inttostr(GetPixel(DC,Pt.x,Pt.y));
End;
auf label1 den farbwert des jeweiligen pixels, auf dem sich die maus befindet!

Problem gelöst, auf zum nächsten! DANKE AN ALLE


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 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