Einzelnen Beitrag anzeigen

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