![]() |
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 |
Re: Pixelfarbe abfragen mit Delphi
Vielleicht so:
Delphi-Quellcode:
Hab's aber nicht gestestet!
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; |
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 |
Re: Pixelfarbe abfragen mit Delphi
Vielleicht musst du es noch mit ChildWindowFromPoint kombinieren.
|
Re: Pixelfarbe abfragen mit Delphi
hast du ne idee, wie der quelltext dazu aussehen könnte?
aber danke schonmal :thuimb: |
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).
|
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: |
Re: Pixelfarbe abfragen mit Delphi
ich meine es ungefähr so (jetzt müsste es eigentlich funktionieren):
Delphi-Quellcode:
(edit: du könntest auch einfach einen Screenshot erstellen und dort dann die Pixel auslesen...)
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; |
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... |
Re: Pixelfarbe abfragen mit Delphi
Alle, die der Anwender sieht. Probier's doch einafch aus...
|
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: |
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.
|
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:
Und an alle Rosinensucher: Ja ich weiss was ein Mousehook ist. :cyclops:
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; Viele Grüsse OLLI |
Re: Pixelfarbe abfragen mit Delphi
vereinfacht ausgedrückt, liefert
Code:
auf label1 den farbwert des jeweiligen pixels, auf dem sich die maus befindet!
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; 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