AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Gameoverlay mittels API

Ein Thema von RedShakal · begonnen am 12. Jul 2010 · letzter Beitrag vom 13. Jul 2010
Antwort Antwort
RedShakal
(Gast)

n/a Beiträge
 
#1

Gameoverlay mittels API

  Alt 12. Jul 2010, 22:19
Hallo zusammen, über einen Link vom SwissDelphiCenter habe ich einen Desktop Overlay gefunden, mit dem es mir nach sehr langer suche endlich möglich war einen Text in einem Fullscreen DDraw game zu zeichnen.Das ganze funktioniert auf XP Vista und 7. Das Problem könnt ihr euch sicher denken: der Text flimmert.

Meine Frage: ist es möglich die Framerate des Spiels auszulesen und den Overlay entsprechend zu syncronisieren, damit es nichtmehr flimmert? Gleich vorweg: Das Spiel hat keinen Online Modus kein Anticheat und der Overlay ist auch nicht fürs Cheaten gedacht

Hier mal der Code den ich mir zusammenkopiert hab

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, tlhelp32, ShellAPI;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    procedure WriteText( TransText:string);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
      begin
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID;
      end;
    end;
    CloseHandle(hProcSnap);
  end;
end;


function GetProcessHandleFromID(ID: DWORD): THandle;
begin
  result := OpenProcess(SYNCHRONIZE, False, ID);
  CloseHandle(result);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  hProcess: THandle;
  wf: DWORD;
begin
  hProcess := GetProcessHandleFromID(GetProcessID('Kknd2.exe'));
  if hProcess <> 0 then WriteText('Overlay test');
end;

procedure TForm1.WriteText( TransText:string);
var
  MyHand:HWND;
  MyDc:HDC;
  MyCanvas:TCanvas;
begin
  MyHand:=GetDesktopWindow;
  MyDc:=GetWindowDC(MyHand);
  MyCanvas:=TCanvas.Create;
  MyCanvas.Handle:=MyDC;
  BeginPath( MyCanvas.Handle);
  MyCanvas.Font.Color:=clBlue;
  MyCanvas.Font.Name:='Arial';
  MyCanvas.Font.Size:=30;
  SetBkMode( MyCanvas.Handle,TRANSPARENT);
  EndPath( MyCanvas.Handle);
  MyCanvas.TextOut( 200,50,TransText);
end;


end.

Geändert von mkinzler (12. Jul 2010 um 22:41 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Gameoverlay mittels API

  Alt 12. Jul 2010, 22:27
Selbst synchron wird das flimmern, da (DirectX/OGL-)Overlays sich nicht ohne API-Hook daran hindern lassen, sich darzustellen. D.h. du wirst immer einen kleinen Moment haben, in dem dein Text nicht da steht, und so timing-genau wird man das nicht wirklich über die reine WinAPI schaffen, dass es nicht mehr auffällt. Diese bietet auch so keine Möglichkeit die FPS auszulesen - das bieten die Grafik-APIs ja nicht einmal selbst von Haus aus an, und wird immer von den Programmen/Spielen selbst errechnet. Fraps macht das auch nur über's Hooken der Present-Methoden. Wenn das anders ginge, wäre der ganze Aufwand über API-Hooks ja nie angestellt worden
Fazit: Entweder ne Ecke mehr Arbeit aufwenden, oder mit dem Geflimmer Freundschaft schließen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (12. Jul 2010 um 22:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Gameoverlay mittels API

  Alt 12. Jul 2010, 22:33
soweit ich mich erinnere ist das ganze unter dx 10 ungleich komplizierter als unter dx 9, bei dx 10 hat sich eine menge geändert.
Gruß
Cookie
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Gameoverlay mittels API

  Alt 13. Jul 2010, 03:11
Oh stimmt, das gute alte Present() wird da ja zu einer SwapChain - da hab ich so noch gar nicht drüber nachgedacht
(Hab mich nur darüber geärgert, dass ich sehr viel Initialisierungszeugs, welches ich unter/für DX9 grad frisch gelernt hab, gleich mal wieder über Bord werfen konnte )
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Gameoverlay mittels API

  Alt 13. Jul 2010, 12:46
Vergiss nicht, die temporäre Klasseninstanz "MyCanvas" in WriteText freizugeben.
Ansonsten wächst nämlich deine Application im Interval von Timer1.Interval...
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Gameoverlay mittels API

  Alt 13. Jul 2010, 13:04
Vergiss nicht, die temporäre Klasseninstanz "MyCanvas" in WriteText freizugeben.
Ansonsten wächst nämlich deine Application im Interval von Timer1.Interval...
Oder man erstellt das Canvas nur einmal.

Folgendes nach OnCreate der Form und das MyCanvas.Free nach OnDestroy.
Delphi-Quellcode:
MyCanvas := TCanvas.Create;
MyCanvas.Handle := GetWindowDC(GetDesktopWindow);
$2B or not $2B
  Mit Zitat antworten Zitat
RedShakal
(Gast)

n/a Beiträge
 
#7

AW: Gameoverlay mittels API

  Alt 13. Jul 2010, 18:14
Der Code war eigentlich eher als temporärer test gedacht mit der absicht zu prüfen ob es überhaupt so klappt wie ich mir das vorstelle. Ich suche bereits seit einer ewigkeit nach einem funktionierendem flimmerfreien DDraw Overlay hook bisher leider erfolglos
  Mit Zitat antworten Zitat
MasterTobi

Registriert seit: 29. Apr 2007
212 Beiträge
 
#8

AW: Gameoverlay mittels API

  Alt 13. Jul 2010, 23:26
da bist du nicht allein, suche auch schon ewigkeiten -.-
MFG
Tobi
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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