AGB  ·  Datenschutz  ·  Impressum  







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

Pixelabfrage bei (dx)Spiel

Ein Thema von d3pp · begonnen am 31. Mai 2012 · letzter Beitrag vom 1. Jun 2012
Antwort Antwort
d3pp

Registriert seit: 31. Mai 2012
2 Beiträge
 
#1

Pixelabfrage bei (dx)Spiel

  Alt 31. Mai 2012, 04:10
Hallo,

ich versuche mich schon einige Zeit an folgender Aufgabe:
Ich möchte eine Pixelabfrage in einem Spiel (dx?) machen. Über die Pixelabfrage les ich eine Zahl aus, die ich dann in eine Listbox packe.
Dieses Spiel kann man mit der Einstellung "full windowed", "windowed" und "fullscreen" starten.

Bei "fullscreen" funktioniert getpixel etc nicht, müsste da wohl hooken... selbst Screenshot mittels Print-taste klappt nicht. Also wohl dx overlay etc...
"Windowed" fällt als Option weg, da das Fenster dann skaliert ist.

Bleibt die Option "full windowed". Dort kann ich über den Umweg
Delphi-Quellcode:
Keybd_Event(VK_SNAPSHOT,0,0,0);
sleep(250);
keybd_event(VK_SNAPSHOT , 0, KEYEVENTF_KEYUP, 0);
einen Screenshot anfertigen und dann die Pixel auslesen. Soweit zumindest die Halbtheorie.

Das klappt nicht so richtig.
1. wirft "Clipboard" häufiger mal ne Exception und 2. klappt das Auslesen nur wenn
a) das Fenster meiner Anwendung aktiv ist und
b) wenn ich die Prozedur per Button aufrufe.

a) wäre nicht das Problem, kann es mit SetForegroundWindow(application.Handle); ja nach vorne holen.
Allerdings klappt es dann trotzdem erst, wenn die aktuelle Prozedur zuende ist und ich dann die Abfrage nochmal manuell per Buttonklick starte.

Hier mal die wohl entscheidenen Codeblöcke:

Screenshot
Delphi-Quellcode:
procedure Screenshot();
begin
Keybd_Event(VK_SNAPSHOT,0,0,0);
sleep(250);
keybd_event(VK_SNAPSHOT , 0, KEYEVENTF_KEYUP, 0);
end;
Prozedur zum Pixelabfragen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var k: integer; // Schleifenindex Ziffern
var clip: TClipboard;
begin
zahl:='';
clip:=TClipboard.Create;
clip.Open;
Screenshot();
mybitmap:=tBitmap.Create;
MyBitmap.PixelFormat:= pf24Bit;
  try if Clip.HasFormat(CF_BITMAP) then begin mybitmap.LoadFromClipboardFormat(CF_BITMAP,clip.GetAsHandle(CF_BITMAP),0); end else begin form1.ListBox2.Items.add('NICHT BITMAP'); end;
clip.Close;
clip.Clear;
clip.free;

......// Zahlerkennung

Listbox1.Items.Add(zahl);
mybitmap.Destroy;

    except on E:Exception
    do begin
    exit;
    end;
   end;
end;
Diese Prozedur zur Zahlerkennung wird im Hauptcode wie folgt aufgerufen:
Delphi-Quellcode:
....
// Merkmal auslesen
 form1.SetFocus;
 SetForegroundWindow(application.Handle);
sleep(500);
form1.Button1Click(Form1.Button1);
sleep(350);
form1.Button1Click(Form1.Button1);
sleep(350);
....
Dabei bekomm ich stets ausgegeben, wenn ich nicht manuell nachmal Button2click ausführe, dass wohl das Clipboard leer ist/ oder kein Bitmap enthält.


Wo liegt hier ein Fehler begraben?

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Pixelabfrage bei (dx)Spiel

  Alt 31. Mai 2012, 07:41
Wenn es dein eigenes Spiel ist, dann gibt es doch zwei Ebenen:

1 Die Informationen mit denen die Ausgabe erstellt wird
2 Die gezeichneten Informationen (Ausgabe auf dem Bildschirm)

Wie du schon bemerkt hast, ist das Auslesen aus der 2. Ebene etwas kompliziert. Warum holst du dir die Informationen nicht aus der 1. Ebene?

Zum Clipboard:
Die Zwischenablage ist ja nicht ausschließlich für dein Programm da, sondern für das gesamte System. Also können auch andere Teile des Systems auf die Zwischenablage zugreifen. Es darf aber immer nur einer die Zwischenablage abfragen oder beschreiben. Hier sind also Kollisionen denkbar, die du abfangen müsstest.

Insgesamt ist das aber eine sehr schlechte Wahl, sich so die Informationen zu beschaffen von einer Ausgabe, die man selber erstellt hat.

Ist ein bisserl wie einen Brief schreiben, ausdrucken, einscannen und dann per OCR an den Text zu kommen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Medium

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

AW: Pixelabfrage bei (dx)Spiel

  Alt 31. Mai 2012, 09:02
Dieses Spiel kann man mit der Einstellung "full windowed", "windowed" und "fullscreen" starten.
Ich würde empfehlen, Diablo 3 nicht mit Hooks und anderen Kniffen anzurücken. Der Blizzard Warden ist ein pfiffiges Kerlchen, und soooo billig sind die Accounts dann auch nicht
"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
d3pp

Registriert seit: 31. Mai 2012
2 Beiträge
 
#4

AW: Pixelabfrage bei (dx)Spiel

  Alt 1. Jun 2012, 02:03
Hi.
Hier nochmal ein wenig mehr meine Ausgangslage erklärt...

Ich möchte in Diablo 3 eine Zahl auslesen, um eine Statistik für einen Freund anzufertigen, welcher das für ein Projekt an der Uni benötigt (Deutschstudent, machen atm ein Proseminar über Computerspiele). Dies sollte bestmöglichst fortlaufend geschehen, also im Hintergrund mitprotokolliert werden.

D3 läuft wohl mit directx, nur im "full windowed" Modus lässt sich über "Drucken" ein Screenshot anfertigen (Hier lassen sich wohl ein paar WinAPIs nutzen).
Hooking-Techniken sind mir zu kompliziert und werden vom Hersteller des Spiels wohl nicht gern gesehen.
Daher versuche ich über mit keybd_event einen Screenshot anzufertigen. Die Zahlerkennung funktioniert bereits. Dies habe ich mit einigen angefertigten Screenshots getestet.

Zum akt. Programm: Die angesprochene Button2click ist eine Prozedur, die lediglich den Screenshot anfertigt, dann von der Zwischenablage den Screenshot in die bitmap packt und von dort die Zahl ausliest und in die Listbox schreibt.

Ferner gibt es die Button4click Prozedur, dies ist der eigentliche "Start" der autom Protokollierung. Hier wird im Spiel das entsprechende Fenster aufgerufen und dann auch die button2click aufgrufen.

Es gibt noch ein paar weitere Einstellungen aufm Formular, die aber nicht weiter interessant sind.

Aktueller Stand ist, dass die button4click mich wunderbar zum Fesnter bringt, wo der Screenshot gemacht wird. Dann kommt es manchmal zu Exceptions wegen des Clipboards und meistens scheitert er dann daran, dass er wohl nicht den Screenshot anfertigt. Dies klappt erst, wenn a) das Fenster aktiv ist und b) ich die Button2click durch Button2 starte. Weiteres Problem er verarbeitet immer komischerweise den Screenshot, der vor einem Aufruf angefertigt wurde, nicht den aktuellen...

Meine Fragen: a)Warum klappt der Screenshot nur, wenn das Fenster aktiv ist. Für einen Screenshot mit der "Drücken-taste" braucht auch kein Fenster aktiv sein. b) Hat jmd eine Idee, warum nicht der aktuelle Screenshot verarbeitet wird und c) Warum klappt die Erkennung bei aktiven fesnter nicht aus der Button4click heraus, sondern nur durch manuelle betätigung von button2click.

Danke
  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 18:27 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