Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit RGB-Suchtool (https://www.delphipraxis.net/109677-problem-mit-rgb-suchtool.html)

rhodan 5. Mär 2008 18:48


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:
  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.
Bzw. wäre es auch möglich die Koordinaten des gefundenen Pixels anstatt des 'Gefunden!' in der Caption von Button1 erscheinen zu lassen?

Vielen lieben dank & schönen Abend

gruß rhodan

jfheins 5. Mär 2008 19:02

Re: Problem mit RGB-Suchtool
 
Ich habe auch mal sowas programmiert - einen Bot für Hier im Forum suchenHeiliger Damm ;)

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:
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;
Versuch mal 3 Dinge:
:arrow: Kopier den DC, den du hast, auf dein Form in ein Image - ob du auch das richtige hast
Delphi-Quellcode:
StretchBlt(PaintBox1.Canvas.Handle,
    0,
    0,
    PaintBox1.Width,
    PaintBox1.Height,
    Bild.Canvas.Handle,
    0,
    0,
    CopyWidth,
    CopyHeight,
    SRCCOPY);
:arrow: Debug das durch, und schau mal was da beim Verglich schiefläuft
:arrow: keine Ahnung ^^

rhodan 8. Mär 2008 17:26

Re: Problem mit RGB-Suchtool
 
danke dir, problem hat sich gelöst :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz