Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Eingaben eines andern Programms emulieren? (https://www.delphipraxis.net/54771-eingaben-eines-andern-programms-emulieren.html)

Kedariodakon 11. Okt 2005 15:09


Eingaben eines andern Programms emulieren?
 
Ich möchte einen Maustastendruck (rechts/links) an ein Spiel/Programm senden, möglichst ohne das sich die Mausposition ändert, ist dies möglich? (WindowsMessages)(auch bei DirectX?)
Im nächsten Schritt sollen auch Tastatureingaben gesendet werden.

Im nächsten Schritt sollen Tastatureingaben abgfangen werden.

Hat jemand schonmal sowas ähnliches gemacht und einen Ansatzpunkt für mich?


Bye

Rastaman 11. Okt 2005 15:41

Re: Eingaben eines andern Programms emulieren?
 
Vielleicht mit dieser Funktion aus der MSN.
Code:
VOID mouse_event(          DWORD dwFlags,
    DWORD dx,
    DWORD dy,
    DWORD dwData,
    ULONG_PTR dwExtraInfo
);
Würds so versuchen:
Code:
var
  x, y: Integer;
begin
  x := Mouse.CursorPos.X;
  y := Mouse.CursorPos.Y;
 
  Mouse_Event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
  Mouse_Event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
end;

raffo 11. Okt 2005 15:43

Re: Eingaben eines andern Programms emulieren?
 
Ich hab sowas noch nicht gemacht (aber immer dran gedacht...)

Ich glaube, Du musst zunächst ein HANDLE auf die Anwendung kriegen: http://www.dsdt.info/tipps/?id=633

Die Maus läßt sich abfragen über:

Delphi-Quellcode:
Label1.Caption := IntToStr(Mouse.CursorPos.X);
Label2.Caption := IntToStr(Mouse.CursorPos.Y);
Position setzen über:

Delphi-Quellcode:
Mouse.CursorPos := Point(200, 100);
Einen Mausklick simuliert (jedenfalls in der eigenen Anwendung) etwa so:

Delphi-Quellcode:
Button1.Perform(WM_LBUTTONDOWN,0,0);
Daher nehme ich an, das man mit dem HANDLE auch eine Sendmessage Botschaft schicken kann.

P.S. ich glaub kaum, das jenes auch über DirectX läuft (dafür ist doch DirectX geschaffen worden, das es schnell geht und der ganze Windows Ballast beiseite gelegt wird) - Aber alles nur Theorie...

Kedariodakon 11. Okt 2005 16:27

Re: Eingaben eines andern Programms emulieren?
 
Ok ich erklärs nochmal besser ^^
Wenn dann handelt es sich um eine DirectX Anwendung...
Soweit ich weiß, verarbeiten DirectX Anwendungen Eingaben nicht über Windowsmessages... Liege ich da korrekt?

1. Nun is die Frage wie "sende" ich dem nun Eingaben (Tastatur/Maus) ???
Das ich die Maus bewegen kann, die Position abfragen und drücken kann ist mir schon bekannt, aber ev. werden die ja für DirectX - Anwendungen ignoriert, bzw. sind zu langsam, daher suche ich nach mehreren Möglichkeiten!

Auch wenn will ich die Maus nicht von X nach Y bewegen, den Knopfdrücken und dann nach X zurückbewegen, denn das würde ja in z.b. Spielen für unschöne Effekte sorgen!

2. Wo Hooke ich solche Eingaben? Gerade wieder im Bezug auf DirectX! Reicht es da, wenn ich die Windowsmessages nehm oder muß ich da wieder ganz anders ansetzen? Und das wichtigste, wie verstecke ich solche Aktionen vor dem Programm?

Bye

SirThornberry 11. Okt 2005 16:59

Re: Eingaben eines andern Programms emulieren?
 
@Kedario...: Die Lösung wurde doch schon gepostet (ohne Handle und hat damals auch bei GTA-ViceCity funktioniert)
Zitat:

Delphi-Quellcode:
Mouse_Event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);

@raffo: [OT]
folgendes ist ineffizient.
Zitat:

Delphi-Quellcode:
Label1.Caption := IntToStr(Mouse.CursorPos.X);
Label2.Caption := IntToStr(Mouse.CursorPos.Y);

Denn bei Mouse.CursorPos wird intern GetCursorPos aufgerufen und dann davon das X zurück gegeben.
Du rufst also in dem Fall 2 mal die ApiFunktion GetCursorPos auf (wenn auch indirekt).
Besser ist es dann so
Delphi-Quellcode:
var LPoint: TPoint;
begin
  GetCursorPos(LPoint);
  Label1.Caption := IntToStr(LPoint.X);
  Label2.Caption := IntToStr(LPoint.Y);
end;
oder so (um beim Mouseobject und der Objectorientierung zu bleiben
Delphi-Quellcode:
var LPoint: TPoint;
begin
  LPoint := Mouse.CursorPos;
  Label1.Caption := IntToStr(LPoint.X);
  Label2.Caption := IntToStr(LPoint.Y);
end;
[/OT]

Kedariodakon 11. Okt 2005 17:03

Re: Eingaben eines andern Programms emulieren?
 
Ich glaub dir, dass das geht, die Frage ist nur, wie performant die sache ist ^^
Wie gesagt, suche nach vielen Möglichkeiten, wäre ja mal interessant wie das nun wirklich in Spielen gehändelt wird ^^

Auch gehts nicht nur um die Maus, sondern auch um die Tastatur ^^
Bye

SirThornberry 11. Okt 2005 17:05

Re: Eingaben eines andern Programms emulieren?
 
für Tastatureingaben kannst du "keybd_event" verwenden. Auch dafür braucht man kein Handle


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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