Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 21:10

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Screenshot für Anfänger?
BeitragVerfasst: Do Mär 17, 2005 21:04 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
Hallo
Ich hab mich schon ein bisschen durch das forum gekämpft und auch das einsteiger tutorial gelesen.
Allerdings komm ich immernoch nicht zurecht.

Was ich eigentlich will ist von einem spiel (medal of honor) einen screenshot machen.
Ich hab das schon programmiert, allerdings über die windows funktionen:
Code:
  1. BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,x,y,SRCCOPY);


hier habe ich aber das problem, daß overlays bzw. huds und manchmal auch die spieler oder models nicht am screenshot drauf sind.

jetzt hab ich mir gedacht ich muß doch dirrekt den grafikspeicher auslesen können.

ich hab versucht eine funktion von Sascha Willems aus diesem forum zu nutzen aber bin kläglich gescheitert.

Ich hab dazu ein template runtergeladen und die funktion einfach mit einem button aufgerufen.
damit macht er mir auch ein bild allerdings nur von dem fenster des templates und da auch nur ein schwarzes bild.

Wenn ich das richtig verstehe, muß ich beim inizialisieren der ogl funktionen den handle des fensters übergeben:
Code:
  1. DC := GetDC(Handle);

handle also im sinn von HWND - also würde das dann der handle von dem spiel fenster sein????.

Das würde aber bedeuten ich initalisiere opengl erst nachdem das spiel gestartet ist und ich den handle davon hab.
danach mach ich das init und ruf die screenshot funktion auf?

oder hab ich das komplett falsch verstanden?

ich frag deshalb nach, weil ich schon seit 2 tagen damit rumspiel und einfach keinen screenshot zusammenbekom lol.

Arnulf


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 17, 2005 21:34 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
ich weiß nicht ab es das ist, was du meinst, aber während dem Bild die "Druck"-Taste drücken (über Einfg ;)), und dann kannst du das Bild
in Paint oder so einfügen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 17, 2005 21:36 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Einsteiger-Fragen?

Also von SnagIt7 weiß ich, dass es DirectX verwenden kann, um DirectX Ausgaben zu photographieren. Funktioniert auch einwandfrei. Für OpenGL konnte ich das aber IMHO ganz normal machen.

Dein Problem mit dem nicht vorhandenen HUD dürfte sich leicht erklären lassen. Bei FRAPS war ja cuh eine README dabei, wo ein paar Denkansätze gegeben wurden. Und da wurde auch vom Doublebuffering gesprochen. Es kann einfach sein, dass du ein Bild machst, zu diesem Zeitpunkt aber das HUD noch im Grafikspeicher rumliegt und erst in der nächsten Millisekunde danach gezeichnet wird, dann aber dafür der Rest von der Graphik fehlt.

Dagegen gibt es jetzt direkt AFAIK kein richtiges Mittel, außer höchstens irgendwie Doublebuffering auszumachen, was aber leider wohl flachfallen dürfte...

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 17, 2005 21:45 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
mach's einfach, wie ich's geschrieben hab. Ging bei mir auch


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 17, 2005 21:47 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ich denke mal schon, dass Arnulf die Druck-Taste bekannt ist.
Obwohl?... Bei dem Thread-Titel?

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 17, 2005 22:12 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
mag sein, dass er die kennt. Aber wenn, hätte er es doch auprobiert, oder???? ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 17, 2005 22:14 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
ja ist mir bekannt die druck taste - jetzt mal im ernst.

ich schreib ein anticheat tool für medal of honor - sogar ein sehr gutes.
es wird ja auch schon verwenden in diversen ligen.

ich mach screenshots vom desktop eben mit scrcopy und da fehlen mir leider diese huds.
ich lade die auch dirrekt auf den anticheat server rauf.
Das funktioniert alles wunderbar - bis auf zwei dinge.
1. es lagt sehr beim screenshot holen (nicht beim raufladen).
2. es ist nicht alles drauf was drauf sein sollte.

ich poste mal was ich mir zusammengebastelt hab - ich bekomm aber leider kein bild sondern nur sinnlose grafik pixel.

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, jpeg,
  8.   dglOpenGL, StdCtrls;
  9.  
  10. type
  11. PRGBQuad = ^TRGBQuad;
  12. TRGBQuad = packed record
  13.    Red   : Byte;
  14.    Green : Byte;
  15.    Blue  : Byte;
  16.    Alpha : Byte;
  17.   end;
  18.   TForm1 = class(TForm)
  19.     Button1: TButton;
  20.     Button2: TButton;
  21.     procedure Button1Click(Sender: TObject);
  22.     procedure Button2Click(Sender: TObject);
  23.   private
  24.     { Private declarations }
  25.   public
  26.     RC        : HGLRC;
  27.     DC        : HDC;
  28.     ShowFPS   : Boolean;
  29.     FontBase  : GLUInt;
  30.     StartTick : Cardinal;
  31.     Frames    : Integer;
  32.     FPS       : Single;
  33.     { Public declarations }
  34.   end;
  35.  
  36. var
  37.   Form1: TForm1;
  38.  
  39. implementation
  40.  
  41. {$R *.dfm}
  42.  
  43. // =============================================================================
  44. //  glSaveScreen
  45. // =============================================================================
  46. //  Speichert einen Screenshot des aktuellen Pufferinhaltes
  47. // =============================================================================
  48. procedure glSaveScreen(pFilename : String);
  49. var
  50.  Viewport : array[0..3] of TGLint;
  51.  JPG      : TJPEGImage;
  52.  RGBBits  : PRGBQuad;
  53.  Pixel    : PRGBQuad;
  54.  BMP      : TBitmap;
  55.  Header   : PBitmapInfo;
  56.  x,y      : Integer;
  57.  Temp     : Byte;
  58. begin
  59. glGetIntegerv(GL_VIEWPORT, @Viewport);
  60. GetMem(RGBBits, Viewport[2]*Viewport[3]*4);
  61. glFinish;
  62.  
  63. glPixelStorei(GL_PACK_ALIGNMENT, 4);
  64. glPixelStorei(GL_PACK_ROW_LENGTH, 0);
  65. glPixelStorei(GL_PACK_SKIP_ROWS, 0);
  66. glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
  67. glReadPixels(0, 0, Viewport[2], Viewport[3], GL_RGBA, GL_UNSIGNED_BYTE, RGBBits);
  68. // Screenshot als JPG speichern
  69. JPG := TJPEGImage.Create;
  70. BMP := TBitmap.Create;
  71. BMP.PixelFormat := pf32Bit;
  72. BMP.Width       := Viewport[2];
  73. BMP.Height      := Viewport[3];
  74. GetMem(Header, SizeOf(TBitmapInfoHeader));
  75. with Header^.bmiHeader do
  76.  begin
  77.  biSize        := SizeOf(TBitmapInfoHeader);
  78.  biWidth       := Viewport[2];
  79.  biHeight      := Viewport[3];
  80.  biPlanes      := 1;
  81.  biBitCount    := 32;
  82.  biCompression := BI_RGB;
  83.  biSizeImage   := Viewport[2]*Viewport[3]*4;
  84.  end;
  85. // Rot und Blau vertauschen
  86. Pixel := RGBBits;
  87. for x := 0 to Viewport[2]-1 do
  88.  for y := 0 to Viewport[3]-1 do
  89.   begin
  90.   Temp       := Pixel.Red;
  91.   Pixel.Red  := Pixel.Blue;
  92.   Pixel.Blue := Temp;
  93.   inc(Pixel);
  94.   end;
  95. SetDIBits(Bmp.Canvas.Handle, Bmp.Handle, 0, Viewport[3], RGBBits, TBitmapInfo(Header^), DIB_RGB_COLORS);
  96. JPG.CompressionQuality := 100;
  97. JPG.Assign(BMP);
  98. JPG.SaveToFile(pFileName);
  99. FreeMem(Header);
  100. FreeMem(RGBBits);
  101. JPG.Free;
  102. BMP.Free;
  103. end;
  104.  
  105.  
  106. procedure TForm1.Button1Click(Sender: TObject);
  107. var FoundWindow : hwnd;
  108. begin
  109. // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  110. // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  111. // Gerätekontext ungültig wird!
  112. // GoToFullscreen(1600, 1200, 32, 75);
  113.  
  114. // OpenGL-Funtionen initialisieren
  115. InitOpenGL;
  116.  FoundWindow := FindWindowEx(0 ,0 , 'Medal of Honor Allied Assault(TM) Spearhead', nil);
  117. if foundwindow > 0 then
  118. begin
  119. // Gerätekontext holen
  120. DC := GetDC(FoundWindow);
  121. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  122. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  123. // Erstellten Renderkontext aktivieren
  124. ActivateRenderingContext(DC, RC);
  125. // Tiefenpuffer aktivieren
  126. glEnable(GL_DEPTH_TEST);
  127. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) \"durchlassen\"
  128. glDepthFunc(GL_LESS);
  129. // Löschfarbe für Farbpuffer setzen
  130. glClearColor(0,0,0,0);
  131. // Displayfont erstellen
  132. //BuildFont('MS Sans Serif');
  133. // Idleevent für Rendervorgang zuweisen
  134. //Application.OnIdle := ApplicationEventsIdle;
  135. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  136. StartTick := GetTickCount;
  137. Form1.Caption := inttostr (FoundWindow);
  138. end
  139. else
  140. Form1.Caption := 'Nix Gefunden';
  141. end;
  142.  
  143. procedure TForm1.Button2Click(Sender: TObject);
  144. begin
  145. glSaveScreen ('nothing.jpg');
  146. end;
  147.  
  148. end.



Also ich bin kein völliger delphi anfänger - obwohl ich erst seit 3 monaten damit arbeite.
wenn sich jemand für den anticheat interessiert:http://www.gamehost.biz/webmanager/view.php?docid=3379&page=enterfilesub&mainarea=117&subarea=118

ist ja ziemlich fertig - nur die screenshots muß ich irgendwie besser machen.

Arnulf

Moderiert von Lossy eX: Code durch Pascaltag ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 11:08 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Ich gebe dir meine angepaste Quaqe II Version of GLScreenShot-Procedure. Zwar funktioniert es nur mit *.tga Format, aber was soll´s.
Code:
  1.  
  2. procedure GLScreenShot(name : string);
  3.  
  4. type TTGAHEADER = packed record
  5.     tfType : Byte;
  6.     tfColorMapType : Byte;
  7.     tfImageType : Byte;
  8.     tfColorMapSpec : Array[0..4] of Byte;
  9.     tfOrigX : Array [0..1] of Byte;
  10.     tfOrigY : Array [0..1] of Byte;
  11.     tfWidth : Array [0..1] of Byte;
  12.     tfHeight : Array [0..1] of Byte;
  13.     tfBpp : Byte;
  14.     tfImageDes : Byte;
  15.   end;
  16.  
  17. const MaxSize_ = 1024 * 768 * 4 + 1;
  18.  
  19. var Buffer : array of Byte;
  20.     c,i,j,temp : integer;
  21.     f : file;
  22.     tgaHeader : TTGAHEADER;
  23.     ffwidth, ffheight : integer;
  24.     viewport : Array[0..3] of integer;
  25.  
  26. begin
  27.  glGetIntegerv(GL_VIEWPORT, @viewport);
  28.  ffwidth := viewport[2];
  29.  ffheight:= viewport[3];
  30.  
  31.  c:= ffWidth * ffHeight * 4;
  32.  
  33.  if c>maxsize_ then Exit;
  34.  
  35.  SetLength(buffer,c);
  36.  
  37.  ZeroMemory(@tgaHeader, SizeOf(tgaHeader));
  38.  
  39.     // Fill the structure with info for the image to be saved
  40.     tgaHeader.tfImageType := 2; // TGA_RGB = 2
  41.     tgaHeader.tfWidth[0] := ffWidth and 255;
  42.     tgaHeader.tfWidth[1] := ffWidth shr 8;
  43.     tgaHeader.tfHeight[0] := ffHeight and 255;
  44.     tgaHeader.tfHeight[1] := ffHeight shr 8;
  45.     tgaHeader.tfBpp := 24;
  46.  
  47.  glReadPixels(0,0,ffWidth, ffHeight, GL_RGBA, GL_UNSIGNED_BYTE, @Buffer[0]);   // get image as 32-bit format
  48.  
  49.     // swap rgb to bgr
  50.      i := 0;
  51.      while ( i < c) do
  52.      begin
  53.         temp := buffer[i];
  54.         buffer[i] := buffer[i+2];
  55.         buffer[i+2] := temp;
  56.       inc(i,4);
  57.      end;
  58.  
  59.  c := ffwidth * ffheight * 3;
  60.  i := 0;
  61.  j := 0;
  62.  
  63.     while ( i < c) do        // convert from 32-bit to 24 bitformat
  64.     begin
  65.       Buffer[i] := Buffer[j];
  66.       Buffer[i+1] := Buffer[j+1];
  67.       Buffer[i+2] := Buffer[j+2];
  68.  
  69.       Inc(i,3);
  70.       Inc(j,4);
  71.     end;
  72.  
  73.  AssignFile(f, name);
  74.  Rewrite( f,1 );
  75.  
  76.  BlockWrite(F, tgaHeader, SizeOf(tgaHeader));
  77.  BlockWrite(f, buffer[0], c );
  78.  
  79.  CloseFile(f);
  80.  SetLength(buffer, 0 );
  81.  
  82. end;
  83.  

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 13:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
wie wäre es denn, wenn du
1. die framerate holst(sollte ja gehen, die meisten anticheat-tools sind ja hacks)
2. 2 bis 4 shots innerhalb dieser zeitspanne machst
3. und dann mal schaust was rauskommt?

das wäre bestimmt interessant, oder?

EDIT: natürlich mit der methode, die funktioniert, aber das hud o.ä. fehlt.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 14:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also warum es bei dir lagt kann ich dir sagen. (Denke ich mal)

1. glReadPixels ist ziemlich langsam.
2. Als JPG Komprimieren ist ebenso sehr langsam.
Wenn du beides zusammen in einem Atemzug machst, dürfte der Rechner ca 750ms (PI mal Daumen) mit deiner Arbeit beschäftigt sein. Das führt dann natürlich unweigerlich dazu, dass es langsam ist.

Was mich allerdings ein wenig wundert ist die Tatsache, dass das Auslesen des Fensterinhaltes (zwar auch nicht wesentlich schneller) keine sinnvollen Ergebnisse geliefert hat. Normal ließt du ja nur das aus was auf dem Bildschirm dargestellt wird. Das sollte ja ein sinnvolles Bild sein.

Außerdem erstellst du deinen eigenen RenderContext auf dem Fenster von Medal of Honor. Wenn ich mich nicht irre dürften die dann nichts miteinander zu tun haben. Habe so etwas aber auch noch nie probiert.

Allerdings das schon mal angesprochene Fraps macht das. Wäre mal ganz interessant herraus zufinden was er genau macht. Der ist nämlich auch in der Lage auf sinnvolle Art und Weise ein Screenshot von einem Programm anzufertigen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 14:35 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
Ich hab die methode von sniper_w probiert aber es kommt das gleiche raus wie mit dem bitmap bzw. jpg.

Ich zeig euch mal das bild das rauskommt:
Bild

also ob die farbpalette nicht stimmt ...

Arnulf[/img]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 14:45 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
@ Lossy eX
du hast das falsch verstanden - die methode die ich bisher benutzt habe schaut so aus und das funktioniert recht gut.
bis auf lag und das fehlen von teilen:

Code:
  1. procedure ScreenShot(x : integer; y : integer; Width : integer; Height : integer; bm : TBitMap);
  2.           var
  3.              dc: HDC; lpPal : PLOGPALETTE;
  4.           begin
  5.                if ((Width = 0) OR (Height = 0)) then exit;
  6.                bm.Width := Width;
  7.                bm.Height := Height;
  8.                dc := GetDc(0);
  9.                if (dc = 0) then exit;
  10.                if (GetDeviceCaps(dc, RASTERCAPS) AND RC_PALETTE = RC_PALETTE) then
  11.                begin
  12.                     GetMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
  13.                     FillChar(lpPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
  14.                     lpPal^.palVersion := $300;
  15.                     lpPal^.palNumEntries :=GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry);
  16.                     if (lpPal^.PalNumEntries <> 0) then
  17.                     begin
  18.                          {create the palette}
  19.                          bm.Palette := CreatePalette(lpPal^);
  20.                     end;
  21.                     FreeMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
  22.                end;
  23.                BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,x,y,SRCCOPY);
  24.                ReleaseDc(0, dc);
  25. end;


rauskommen tut dann sowas:

Bild

und hier vom gleichen spieler ein bild - wo einfach alles fehlt - der spieler selbst alle anzeigen und auch die gegner.
Das ist für einen anitcheat unbrauchbar :)

Bild


Also versuche ich eine methode zu finden wo ich alles drauf bekomme und nach möglichkeit nicht die windows funktionen verwendet (wegen lag).

Arnulf

Moderiert von Lossy eX: Code durch Pascaltag ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
also ob die farbpalette nicht stimmt ...

Ne. Du das ist keine falsche Farbpalette. Ich arbeite derzeit an Bildern an denen ich die Farbpalette verändere. Und die Bilder sehen noch wesentlich mehr nach Bildern aus als dein willenloser Speicherauszug.
Wie du bei dem Bild siehst ist das ein wiederkehrendes Muster. Ich tippe einfach mal darauf, dass das in nicht initialisierter Speicherbereich ist. Also als ob du etwas ausgelesen hättest was vorher von etwas anderem verwendet wurde. Also texturen oder so. Aber dafür ist das eigentlich zu durcheinander.


Was mir aber da gerade auffällt. Ist jetzt auch nicht wichtig, weil es ja eh nicht funktioniert. Evtl wäre es sinnvoll, nicht so viel Aktionen durchzuführen. Also in dem Code von sniper. Erst Bilddaten auslesen, dann Rot und Blau Tauschen, dann Alpha wegschmeißen. Die beiden letzten Aktionen könnte man in eine packen. Also RGB in BGR umformen und gleichzeitig das Alpha wegfallen lassen. Somit spart man sich schon ein mal den Speicher zu kopieren. Noch besser wäre es aber wenn OpenGL einem das richtige Format liefert.
glReadPixels müsste das Format GL_BGR verstehen. Somit wäre der Buffer den wir von OpenGL bekommen auch genau schon das was wir direkt auf die Platte schreiben könnten. Somit würden keine zusätzlichen Speicherkopierereien anfallen. Das aber nur mal so am Rande.

Zitat:
du hast das falsch verstanden - die methode die ich bisher benutzt habe schaut so aus und das funktioniert recht gut.
bis auf lag und das fehlen von teilen:

Na ja. Ich meinte mit dem nicht funktionieren ja eigentlich das Fehlen von verschiedenen Teilen. ;-) Aber Wundern tut es mich dennoch wieso da so etwas dabei raus kommt.

Hat du schon mal versucht nicht den Desktop (GetDC(0)) sondern das mit dem DC des Fensters zu machen? Ich denke mal ja. Aber sicher ist sicher.

PS: Wenn du Code postest dann benutz bitte die Pascaltags und nicht die Code Tags. Danke.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 15:06 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Ich hab die methode von sniper_w probiert aber es kommt das gleiche raus wie mit dem bitmap bzw. jpg.

Natürlich kommt nichts, weli du kein Zugriff auf RC von MedalOfHonor hast. Sonst, mit einem eigenem RC geht es wunderbar, schließlich ist das so in Quake II gemacht.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 15:13 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Vielleicht so:

Code:
  1. procedure MakeScreenShot(const ATarget: TBitmap);
  2. var
  3.   DesktopDC: HDC;
  4. begin
  5.   DesktopDC := CreateDC('DISPLAY', nil, nil, nil);
  6.   try
  7.     ATarget.PixelFormat := pfDevice;
  8.     ATarget.Width := Screen.Width;
  9.     ATarget.Height := Screen.Height;
  10.  
  11.     BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY);
  12.   finally
  13.     DeleteDC(DesktopDC);
  14.   end;
  15. end;


:D:D:D:D


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 15 Queries | GZIP : On ]