![]() |
Problem mit RGB-Suchtool
Abend Community :stupid:
Ich bin gerade etwas verwirrt. Folgender Code sollte eigentlich auf Knopfdruck den unter findwindow angegebenen Fenstertitel in den Vordergrund holen und ihn nach RGB Werten die ich unter 'public' vorher deklariert habe absuchen. Wird das Programm fündig erscheint ein Button auf dem 'Gefunden!' steht. Seltsam ist nur: wenn ich z.B Windows Pinball auf diese weise absuche scheint er JEDEN RGB Wert den ich vorher festlege in dem Spiel zu finden (selbst wenn diese Farbe gar nicht vorkommt). Erschaffe ich allerdings ein eigenes Projekt mit schwarzem Hintergrund und einem roten Panel darauf, scheint er nicht mal das Rot dort zu finden :gruebel: (die genauen RGB Werte hab ich mir mit Photoshop angeguckt) Wäre jemand vielleicht so freundlich einen kurzen blick auf den code zu werfen bzw. einen kurzen Test zu machen und mir zu sagen ob ich Müll geschrieben hab oder nicht? Ich traue den Ergebnissen nicht mehr ^^. (auf dem formular sind nur 2 buttons wobei button1 auf visible:=false steht).
Delphi-Quellcode:
Bzw. wäre es auch möglich die Koordinaten des gefundenen Pixels anstatt des 'Gefunden!' in der Caption von Button1 erscheinen zu lassen?
public
pixel_R: 150..150; pixel_G: 4..4; //RGB Werte nach denen unten mit 'getRvalue' etc. gesucht werden soll pixel_B: 30..30; width, height:integer; posx,posy:integer; x,y : integer; end; procedure TForm1.Button2Click(Sender: TObject); var game_hwnd : hwnd; dc : hdc; pixel:colorref; get_dc:integer; prect:Trect; begin game_hwnd := findwindow(nil,'3D-Pinball für Windows - Space Cadet'); showwindow (game_hwnd, sw_restore); setforegroundwindow(game_hwnd); setfocus; getwindowrect(game_hwnd,prect); // Rechteck wird gezeichnet in dem nach RGB Werten gesucht werden soll. width:=prect.right-prect.left; height:=prect.Bottom-prect.Top; posx:=prect.left; posy:=prect.Top; dc:=getdc(game_hwnd); pixel:=getpixel(dc,x,y); if (getRvalue(pixel)=pixel_R) and (getGvalue(pixel)=pixel_G) and //Pixel werden auf die oben in 'Public' angegebenen RGB werte kontrolliert.. (getBvalue(pixel)=pixel_B) then begin button1.Visible:=true; end; end; end. Vielen lieben dank & schönen Abend gruß rhodan |
Re: Problem mit RGB-Suchtool
Ich habe auch mal sowas programmiert - einen Bot für
![]() Ich nehme mal an, du hast das Handle bereits, dann musst du dir nen DC besorgen (Hast du getan) und ... Dewr einzige untershcied ist - soweit ich das jetzt auf den 1. Blick sehe - dass du mit GetPixel arbeitetst ....
Delphi-Quellcode:
Versuch mal 3 Dinge:
BitBlt(Bild.Canvas.Handle, 0, 0, CopyWidth, CopyHeight, HDdc, 0, 0, SRCCOPY); // Kopiert das Bild des Spiels in ein Bitmap
index := 0; SetLength(Points, 10); GetWindowRect(HDwnd, HDrect); HDrect.Top := HDrect.Top + GetSystemMetrics(SM_CYCAPTION); for i := 0 to Bild.Height - 1 do begin Pixel := Bild.ScanLine[i]; for j := 0 to Bild.Width - 1 do begin if (Pixel^.rgbtRed in [SpotRed-Toleranz .. SpotRed+Toleranz]) and (Pixel^.rgbtGreen in [SpotGreen-Toleranz .. SpotGreen+Toleranz]) and (Pixel^.rgbtBlue in [SpotBlue-Toleranz .. SpotBlue+Toleranz]) then begin Bild.Canvas.Ellipse(j - 25, i - 25, j + 25, i + 25); // "markiert" den Fundort (X=j, Y=i) end; Inc(Pixel); end; :arrow: Kopier den DC, den du hast, auf dein Form in ein Image - ob du auch das richtige hast
Delphi-Quellcode:
:arrow: Debug das durch, und schau mal was da beim Verglich schiefläuft
StretchBlt(PaintBox1.Canvas.Handle,
0, 0, PaintBox1.Width, PaintBox1.Height, Bild.Canvas.Handle, 0, 0, CopyWidth, CopyHeight, SRCCOPY); :arrow: keine Ahnung ^^ |
Re: Problem mit RGB-Suchtool
danke dir, problem hat sich gelöst :-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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 by Thomas Breitkreuz