Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Welche Farbe hat der Pixel? (https://www.delphipraxis.net/59769-welche-farbe-hat-der-pixel.html)

Schilkschi 28. Dez 2005 14:56


Welche Farbe hat der Pixel?
 
Also liebe Programmierer
Stehe vor einem Problem :)

Ich habe ein Program geöffnet und möchte überprüfen oder der Pixel x,y die Farbe 000000 hat oder gleich dem pixel ist aus einem screenshot. Falls das der Fall ist soll ein Tastendruck simuliert bzw mehrere hintereinander(esc+pfeilhoch+enter) werden.
Mein Problem ist es nun ich möchte nicht 10k screenshots machen da das zu lange dauert und recourcenfressen ist wie ihr euch sicherlich denken könnt, sonder halt nur 1-10 pixel überprüfen, das aber jede Sekunde oder noch schneller wenn es geht.

Mein Programm läuft im Hintergrund ist also nicht aktiv (ich weiß nich ob das relevant ist, denke aber schon).
Tastendruck simulieren hab ich schon nach gesucht und das dürfte kein Problem sein aber das mit dem überprüfen hab ich nirgens gefunden.
In Delphi natürlich :D

Hoffe auf eure Hilfe!

Cookiemaster 28. Dez 2005 17:45

Re: Welche Farbe hat der Pixel?
 
Schau doch mal im Delphi Menü -> Hilfe -> Windows-SDK
Und im Index suchen nach diesen Funktionen:
GetDesktopWindow -> Window-Handle des gesamten Bildschirms holen
GetDC -> Device Context für ein Window-Handle holen.
GetPixel -> Pixelfarbe eines bestimmten Bildpunktes

Zusammen sollte es dann in etwa so aussehen:
Delphi-Quellcode:
var
  hdcDesktop : HDC;
  crefPixel : COLORREF;
begin
  hdcDesktop := GetDC(GetDesktopWindow);

  crefPixel := GetPixel(hdcDesktop, 50, 50);
  ...
  ReleaseDC(GetDesktopWindow, hdcDesktop);
end;
Hab aber nicht getestet ob es wirklich funktioniert.

Schilkschi 28. Dez 2005 18:39

Re: Welche Farbe hat der Pixel?
 
Also ich bin nicht so gut in Delphi also immer schön langsam :D
Erstmal danke für deine Hilfe aber hier eine kleine Prüfprozedur die mir immer wiederdas selbe ergenis leifert :(

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  hdcDesktop : HDC;
  crefPixel : COLORREF;
begin
  randomize;

  hdcDesktop := GetDC(GetDesktopWindow);
  crefPixel := GetPixel(hdcDesktop, random(500), random(500));

  Label1.caption:=inttostr(crefpixel);

  ReleaseDC(GetDesktopWindow, hdcDesktop);
end;
4294967295 ist das ergnis :)
Und ich hab keine Ahnung was mir das sagt XD

Rastaman 28. Dez 2005 20:13

Re: Welche Farbe hat der Pixel?
 
Also ich wusste gar nicht dass es COLORREF gibt. Hätte TColor oder Cardinal benutzt.
Ausserdem: Anstatt GetDesktopWindow einfach ne 0 schreiben, kommt aufs Selbe raus.
Gibt GetDesktopWindow auch einfach nur 0 zurück? Wenn ja, isses die überflüssigste Funktion aller Zeiten :lol:

Edit: Randomize nur im OnCreate-Ereignis schreiben, nicht mehrmals aufrufen.

Khabarakh 28. Dez 2005 21:06

Re: Welche Farbe hat der Pixel?
 
Zitat:

Zitat von Rastaman
Also ich wusste gar nicht dass es COLORREF gibt.

COLORREF ist der Rückgabewert der API-Funktion, warum also nicht auch für die Variable benutzen. Allerdings dürfte es Schilkschis Zahl gar nicht geben, da in COLORREF der Alphakanal immer 0 ist, die Werte also nur bis 2^24 - 1 gehen :stupid: .

Schilkschi 28. Dez 2005 21:47

Re: Welche Farbe hat der Pixel?
 
tjo das bringt mich ja jetzt so null weiter ne ^^

CalganX 28. Dez 2005 22:47

Re: Welche Farbe hat der Pixel?
 
Hi,
guckst du mal im MSDN: MSDN-Library durchsuchenCOLORREF.

Chris

MasterDG 28. Dez 2005 22:51

Re: Welche Farbe hat der Pixel?
 
Hallo!

Also der Wert lässt sich ganz einfach erklären:

Zitat:

The return value is the RGB value of the pixel. If the pixel is outside of the current clipping region, the return value is CLR_INVALID.
Dieser Wert CLR_INVALID ist 4294967295.

Allerdings liegt der Wert doch mit max 500 in dem Bereich der angezeigt wird! :gruebel:

Gruß
MasterDG

Cookiemaster 29. Dez 2005 00:48

Re: Welche Farbe hat der Pixel?
 
Sorry ^^ aber ich hab das auch nur auf die schnelle zusammengestrickt.

Als Entschädigung hier der richtige Code:
Delphi-Quellcode:
// Form1 enthält
// 1 TTimer Objekt, Intervall = 100
// 1 TEdit namens Koord
// 1 TEdit namens Color

// die OnTimer Prozedur des Timers sieht so aus:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  hDesk : HWND;
  hdcDesktop : HDC;
  crefPixel : COLORREF;
  p : TPoint;
begin
  GetCursorPos(p);
  Koord.Text := 'X = ' + inttostr(p.x) + ' Y = ' + inttostr(p.y);

  hDesk := GetDesktopWindow;
  hdcDesktop := GetWindowDC(hDesk);

  crefPixel := GetPixel(hdcDesktop, p.x, p.y);
  color.Text := inttostr(crefPixel);
  ReleaseDC(hDesk, hdcDesktop);
end;
Allerdings schreibt HIER jemand, dass er bei einem ähnlichen Programm in Visual Basic ein Memory-Leak hat.
Hab das mal kurz getestet mit dem Task-Manager. Am Anfang braucht mein Programm 2004 kB Speicher, das wird dann auch tatsächlich immer mehr... immer wenn ich mit der Maus über ein "neues" Fenster drüberfahre (wo die Maus vorher noch nicht war) wird es mehr.
Nach einiger Zeit sind es dann 2388 KB Speicher.

Schilkschi 29. Dez 2005 03:28

Re: Welche Farbe hat der Pixel?
 
Wow du hast mir echt weitergeholfen!
Selbst bei einem Timerintervall von 1 kommen ei mir keine Speicherprobleme auf.
Vielen Dank der Quelltext über mir funktioniert einwandfrei!

-----------------
Suchbegriffe:
Pixelfarbe Pixel Farbe GetWindowDC GetPixelb


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 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 by Thomas Breitkreuz