directx problem
-
Also ich bin ein programm am coden, was man auch in spielen sehen kann (kein dxhook, da das AntiCheat prog. mich rausschmeisst wenn gehookt wird) ich habe es schon so weit gebracht, dass ich im directx modus zwar anzeigen kann, was ich will jedoch flimmert es im directx modus über der dxanwendung. doublebuffered ist natürlich aktiviert! Wenn ich ALT+TAB drücke legt sich des fenster zum programm wechsel ja auch über die dxanwendung ohne diese zu freezen, also muss es möglich sein. Kann ich mir ihrgendwie vorzugsrechte besorgen? wie dx zum beispiel?
Bin schon ein woche an dem thema drann und weiss nicht weiter

-
Besteht die Möglichkeit, das Problem so zu erklären, dass jemand der nicht auf deinem Schoss sitzt es verstehen kann?
AntiCheatprogramm -> ahaa
Hooks -> soso
flimmern -> mmhWas ist nu das Problem das Flimmern? Die Hooks?
Dazu beitragen würde auch irgendwie ein bissssschen Subjekt Prädikat Objekt

-

Also ich möchte mein Anwendungsfenster über einem Spiel darstellen.
Siehe Fraps 1.9 http://www.chip.de/downloads/c1_downloads_13007435.html
Mit diesem Programm lassen sich Filme von Spielen aufzeichnen.
Dabei wird in der oberen linken Ecke des Spiels (DirectX-Anwendung) ein Counter angezeigt.Ich habe schon sehr oft gehört, dass sich DirectX vorzugsrechte über die Hardware verschafft und es somit unmöglich ist, ein Programm zu schreiben, das über einer DirectX-Anwedung im Vollbildmodus laufen kann.
Bei Fraps 1.9 geht es jedoch.

Ein hook ist das verändern der DirectX DLL d3d8.dll z.B um das Spiel zu ändern (wird von vielen cheatern benutzt). Das Spiel hat jedoch ein integriertes AntiCheat-Modul, was genau dies unterbindet und mir somit den weg verbaut.
Jetzt zu meiner Frage. Wie schaltet sich Fraps 1.9 VOR die DirectX-Anwendung o.O
Ich versuche schon länger ein solches Programm zu schreiben, da enorm viele Anwendungsgebiete denkbar wären. Zum beispiel ICQ während dem Zocken übers internet.
Hoffe mir kann nun Jemand helfen

-
Ich habe mir jetzt mal die ReadMe-Datei von Fraps angesehen. Dort schreibt vermutlich der Autor:
I’m trying to draw on the screen using GDI calls. I can see my text but it flickers badly. How can I fix this?
This is a common problem that people encounter. It is quite easy to retrieve a handle to the active window and obtain a device context for the screen. You can then issue standard GDI calls and expect them to be drawn accordingly on the screen.
Unfortunately the flickering problem can’t be avoided. The issue is caused by the fact that most games are double-buffered and GDI only supports single-buffered devices. Whenever you issue GDI calls they are always affecting the same buffer. If the game is double buffered you will see your text half the time, if it’s triple buffered only a third. As far as I know there is no way to obtain a unique device context for the back buffers.
Übersetzt:
Bedauerlicherweise ist es nicht möglich das flickern einer Andwendung, die über DirectX liegt zu unterbinden. Wenn das Spiel double-buffered ist, so sieht man seine Anwendung nur die Hälfte der Zeit (dadurch das flickern) wenn das Spiel triple-buffered ist, dann sieht man die Andwendung nur 1/3 der Zeit.
Bei meinem Spiel kann man triple-buffer deaktivieren.
dadurch flickert es nicht mehr ganz so stark aber immer noch.gibt es eine möglichkeit mein Formular vielleicht tripel-buffered darzustellen anstatt nur DoubleBuffered zu verwenden? Oder eventuell noch mehr?

-
Also ich habe gerade herausgefunden, dass Fraps auch einen hook benutzt.
TeamSpeakoverlay auch... Nr wird dieser von keinem AntiCheat Programm erkannt und ich habe überhaupt keine Ahnung von DirectX hooks, da diese auch nicht mit BCB möglich sind soweit ich weis. Vielleicht belehrt mich ja jemand etwas besserem

-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
hm, ich glaub ja, ein solches programm zu schreiben ist von der Schwierigkeit ca. gleichzusetzen mit dem versuch, ein programm zu hacken und zB. ein Aimbot zu schreiben. Das bedeutet man lässt sich auf den Kampf zwischen cheaten und anticheaten ein und so auf einen kampf zwischen immer neuen updates, welches die wirkung des jeweils anderen programmes unterbinden soll, oder?.. Das heisst, ich würds lassen.
Aber es zu interessant - ich kenn das problem auch von winamp notifications und cs, die nots flimmern bei mir auch. Ich glaube, dass das daran liegt, dass die notifications ein allways-ontop-Fenster haben, dass halt immer wieder gezeichnet wird. Nur cs is einerseits auch vordergrundanwendung, andererseits zeichnet es radikal über den gesamten Bildschirm (evtl. aufs hdc vom Desktop, d.h. getDC(0)). Und ich glaube genau das is der knackpunkt: man wird zeichnen können, was man will, das spiel zeichnet darüber.
Prinzipiell sehe ich die Möglichkeiten:
- Das Spiel darf nicht auf den gesamten Bildschirm zeichnen, ein kleines rechteck müsste zB. vom render context (vom Desktop?) ausgeschlossen werden. ob das geht?..
- eine Art WM_PAINT oder so was vom Spiel abwarten (bei opengl wärs ein Aufruf von glFlush bzw. glFinish), und darauf quasi verzögerungsfrei reagieren und eigenen kram auf das desktopDC zeichnen. Wahrscheinlich wird das Programm allerdings nicht "verraten", wann es redrawt. Dass man den Aufruf von Flush mitbekommt, heißt wahrscheinlich, diese Funktion so zu verändern, dass diese irgendne Nachricht (besser keine weil lahme WM) verschickt, dh. wahrscheinlich ein Hook zu schreiben (schreibt man hooks? oder hooked man? ...)naja, mir isses zu hoch...
-
Geht auch mit ganz normalen DirectDraw Overlays. Hatten wir letztens erst. Such mal in den letzten Wochen im Spieleforum.
-
Ich habe mich jetzt Registriert ^^.
Und den Beitrag gefunden!
http://www.fourcc.org/fccovrly.php
nun habe ich alles wie beschrieben gemacht...
bei
Window Move/Size Processing
The following code should be put in a function called when processing WM_MOVE and WM_SIZE messages. Note that it is vitally important that your window receives WM_MOVE messages even if the size has not changed. If the window is a child of the main application window (as in most cases), these messages are not posted to it by default and you have to relay them from the parent's window handler function.
gehe ich mal davon aus, dass ich den nachfolgenden Code in onresize des forms reinhauen muss und bei
Window Paint Processing
This is the basic code required inside WM_PAINT processing to fill the client area with a colour key value above which the overlay will be displayed. Note the use of a clipper to prevent the DirectDraw Blt call from corrupting any overlying windows, menus, etc.
Many people use normal GDI calls to draw the colour key but this requires a great deal of care when using a palettised desktop since the palette index of a particular RGB colour can change if the palette is altered by another application resulting in your user seeing a lovely (for example) magenta rectangle instead of your nice overlay surface. Using the DirectDraw Blt, however, you can guarantee the value written to the primary surface so your colour key will work regardless of the state of the system palette.
in das onpaint event...
die einzigsten Fehler, die ausgegeben werden sind beim Abschnitt onPaint des Forms:
void __fastcall TFormMain::FormPaint(TObject *Sender) { /****************************************************************/ /* Attach the clipper to the primary surface for this operation */ /****************************************************************/ ddrval = IDirectDrawSurface_SetClipper(lpPrimary, lpClipper); hdc = BeginPaint(hwnd, &ps); /* Fill the client area with colour key */ ptClient.x = ps.rcPaint.left; ptClient.y = ps.rcPaint.top; ClientToScreen(hwnd, &ptClient); rectBlt.left = ptClient.x; rectBlt.top = ptClient.y; ptClient.x = ps.rcPaint.right; ptClient.y = ps.rcPaint.bottom; ClientToScreen(hwnd, &ptClient); rectBlt.right = ptClient.x; rectBlt.bottom = ptClient.y; ddbfx.dwSize = sizeof(DDBLTFX); ddbfx.dwFillColor = dwKeyColour; IDirectDrawSurface_Blt(lpPrimary, &rectBlt, NULL, &rectBlt, DDBLT_COLORFILL | DDBLT_WAIT, &ddbfx); EndPaint(hwnd, &ps); ddrval = IDirectDrawSurface_SetClipper(lpPrimary, NULL); }Build
[C++ Error] main.cpp(360): E2451 Undefined symbol 'hdc'
[C++ Error] main.cpp(360): E2451 Undefined symbol 'ps'
[C++ Error] main.cpp(364): E2451 Undefined symbol 'ptClient'
[C++ Error] main.cpp(366): E2064 Cannot initialize 'const TPoint &' with 'void *'
[C++ Error] main.cpp(366): E2342 Type mismatch in parameter 'Point' (wanted 'const TPoint &', got 'void *')
[C++ Error] main.cpp(366): E2227 Extra parameter in call to _fastcall TControl::ClientToScreen(const TPoint &)
[C++ Error] main.cpp(367): E2451 Undefined symbol 'rectBlt'
[C++ Error] main.cpp(372): E2064 Cannot initialize 'const TPoint &' with 'void *'
[C++ Error] main.cpp(372): E2342 Type mismatch in parameter 'Point' (wanted 'const TPoint &', got 'void *')
[C++ Error] main.cpp(372): E2227 Extra parameter in call to _fastcall TControl::ClientToScreen(const TPoint &)
[C++ Error] main.cpp(376): E2451 Undefined symbol 'ddbfx'Verstehe ich nicht...
was soll denn hdc und ptClient sowie ddbfx bedeuten/herkommen?
Sind nicht deklariert (
DDPIXELFORMAT ddPixelFormat;
HRESULT ddrval;
DDSURFACEDESC ddsd;
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpPrimary;
LPDIRECTDRAWSURFACE lpOverlay;
LPDIRECTDRAWCLIPPER lpClipper;
RECT rectClient;
RECT rectOverlay;
DDOVERLAYFX ddofx;
DWORD dwFlags;
DWORD dwKeyColour;
HWND hwnd;)
wie im beispiel...

Ich frage mich auch ob ddraw überhaupt initialisiert werden kann während eine andere dx anwendung aktiv ist...
Danke

-
meine grafikkarte unterstützt kein ddraw-overlay -.-
entweder muss ich mich jetzt mit dem flackern zufrieden geben
oderengine hooken, was ich gar nicht kann, da dies nicht mit bcb sondern mit vc++ geht
oder das problem mit dem flackern beheben

-
Also, ich weiss das es möglich ist, bestimmte Bereiche auf dem Bildschirm nicht zu "Clearen" also nicht neu zu malen, indem man Rechtecke definiert... weiss selber nicht genau wie das geht habs aber mal gelesen, somit wird dann das eine Rechteck nicht neu gezeichnet und es ist Platz eine andere Anwendung zeichnen zu lassen.
Weiss nicht ob das in die Kategorie "hook" fällt
...
Aber nochmal ein Tipp, wenn es wirklich gehen sollte, tu dir selbst einen Gefallen und schreib eine ReadMe wo drin steht das dieses Programm nur zu Testzwecken dient und du keine Haftug für eventuelle schäden übernimmst.
Ansonsten könnte es ziemlich teuer werden

MfG LJ_1102 :xmas1: