Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GetPixel() funktioniert irgendwie nicht :( (https://www.delphipraxis.net/38756-getpixel-funktioniert-irgendwie-nicht.html)

Wusel 23. Jan 2005 19:45


GetPixel() funktioniert irgendwie nicht :(
 
Guten Abend an alle

Also irgendwie funktioniert GetPixel nur so halb, aber ich denke eher, dass ich einen Fehler gemacht habe :roll:
Ich will einfach während ich spiele, ein Screenshot machen und aus dem Screenshot dann bestimmte Informationen holen (Zahlen). Das hab ich so gelöst, dass ich mir bestimmte Pixel anschaue, sie mit vorgegebenen Mustern von Zahlen vergleiche und dadurch die Zahl bekomme. Das geht in meinem Fall, da die Zahlen alle gleich breit sind und immer an der selben Stelle stehen. Es verändert sich halt nur der Betrag der Zahl. Das funktioniert auch so weit. Jedoch nur, wenn ich z.B. ein Screenshot als Hintergrundbild nehme. Wenn ich im Spiel selbst die Funktion mit GetPixel durchlaufen lasse, gibt GetPixel an jeder Stelle nur den Wert 0 zurück :(
Hier der Code den ich verwende:

Delphi-Quellcode:
var
  imgDC : Cardinal;
begin
  imgDC := 0;

  try
    imgDC := GetDC(0);

    for i := 0 to 6 do //7 Pixel prüfen, um eine Zahl zu identifizieren
      begin
        [...]GetPixel(imgDC, WSDotCoords[i].X, WSDotCoords[i].Y); [...]
      end;
  finally
    if imgDC <> 0 then
      ReleaseDC(0, imgDC);
  end;
end;
Also wie gesagt, wenn ich das im Spiel mache, gibt GetPixel nur 0 zurück. Das Komische ist aber, wenn ich imgDC mit BitBlt() an ein Handle von einem TBitmap übergebe und das Bitmap dann speichere, ist der Screenshot ganz normal da und an den Stellen, die GetPixel() prüfen soll ist definitiv eine Farbe!
Was mach ich denn falsch? :(



Wusel

Elite 23. Jan 2005 20:14

Re: GetPixel() funktioniert irgendwie nicht :(
 
Zitat:

Zitat von Wusel
Das Komische ist aber, wenn ich imgDC mit BitBlt() an ein Handle von einem TBitmap übergebe und das Bitmap dann speichere, ist der Screenshot ganz normal da

Ohne jetzt näher auf das Problem einzugehen: Warum holst du dir dann nicht einfach die gesuchten Pixelfarben über dein erstelltes Bitmap?
Oder ist dir das zu langsam?

Wusel 23. Jan 2005 21:44

Re: GetPixel() funktioniert irgendwie nicht :(
 
Wenn ich das TBitmap benutze, muss ich die Graphics Unit einbinden und dadurch wird mein Programm extrem groß. Habs nich um sonst hier in die Win-API Sparte geschrieben. Will hauptsächlig nur mit den HDCs arbeiten, aber das klappt ja nicht :(

Wusel 24. Jan 2005 17:48

Re: GetPixel() funktioniert irgendwie nicht :(
 
Hat keiner 'ne Idee, warum GetPixel da nicht richtig mitmachen will? :|

TStringlist 24. Jan 2005 18:05

Re: GetPixel() funktioniert irgendwie nicht :(
 
event. ist der von dir mittels 'GetDC' organisierte 'device context' in dem Falle nicht mehr gültig? Versuche es doch auch mal mit 'CreateDC', z.B. so wie in der folgenden kurz-Proc:


Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var DC : HDC;
    AColor : array[1..4] of byte;
begin
  DC:=CreateDC('DISPLAY',NIL,NIL,NIL);
  DWord(AColor) := GetPixel(DC,Mouse.CursorPos.X,Mouse.CursorPos.Y);
  DeleteDC(DC);
  Label1.Caption := 'R: ' + IntToStr(AColor[1]) + ';  ' +
                    'G: ' + IntToStr(AColor[2]) + ';  ' +
                    'B: ' + IntToStr(AColor[3]);
end;

Wusel 24. Jan 2005 18:42

Re: GetPixel() funktioniert irgendwie nicht :(
 
Nein, spielt keine Rolle. Habs versucht mit dem CreateDC, kommt aber auch überall 0 raus, wenn ich es im Spiel mache.
Habs so probiert, dass es die Werte erst speichert und dann, wenn ich aus dem Spiel raus bin, durch nen Tastendruck die Werte ausgibt --> 0
Wenn ich die Werte an ein Label o.ä. übergebe, während ich noch im Spiel bin (also wenn das DC auf jeden Fall noch gültig ist) --> 0
Jedoch kann es in beiden Fällen aus dem DC mittels BitBlt ein TBitmap erstellen :?:

Wenn ich nur auf dem Desktop bin, funktioniert alles, wie es soll ... was ist so unterschiedlich an den DCs während des Spiels und 'normal' im Windows??

DerDan 24. Jan 2005 19:05

Re: GetPixel() funktioniert irgendwie nicht :(
 
Hi,

wenn dein Spiel via DirectX auf den Bildschirm pinselt, dann geht das vielleicht generell nicht, das Pixel über den ganzen Devive Context wieder auszulesen...

ich würd also erstma mit einem zweite Delphi Exe experimentieren, die grob das gleiche macht wie dein Spiel (Zahlen mahlen)

DerDan

Wusel 24. Jan 2005 19:08

Re: GetPixel() funktioniert irgendwie nicht :(
 
Ja, das Spiel läuft über DirectX, aber warum kann ich dann mit dem DC, mit welchem GetPixel nur 0 zurückgibt, mittels BitBlt ein TBitmap erzeugen, welches dann das richtige Bild enthält?

DerDan 24. Jan 2005 19:11

Re: GetPixel() funktioniert irgendwie nicht :(
 
Könnt ja ne inkosistenz in der WinApi sein,

hast ma mit aus einem anderen Prog versucht die Pixels zu bekommen?

DerDan

Wusel 24. Jan 2005 19:14

Re: GetPixel() funktioniert irgendwie nicht :(
 
Wie bereits geschrieben, funktioniert es 'normal' unter Windows mit jedem anderen Fenster/Programm. Sollte halt auch nicht so viel umgerechnet und so werden, da es sonst einen kleinen (oder größeren) Ruckler im Spiel gibt und das wollt ich weitestgehend vermeiden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 Uhr.
Seite 1 von 2  1 2      

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