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 Virtuellen Klick in einem Spiel simulieren (https://www.delphipraxis.net/89311-virtuellen-klick-einem-spiel-simulieren.html)

tweetymr 29. Mär 2007 10:34


Virtuellen Klick in einem Spiel simulieren
 
Hi zusammen,
ich weiß das mit dem Klick simulieren ist eigentlich relativ einfach. Habe es auch oft genug verwendet :P
Doch ich habe es noch nicht mit virtuellen Klicks geschafft :?
Was meine Frage angeht:
Wie bekomme ich einen virtuellen Klick in einer Full Screen-Anwendung simuliert, von der ich keinerlei Handels oder sonstiges kenne?

Bitte helft mir :(

Gruber_Hans_12345 29. Mär 2007 10:38

Re: Virtuellen Klick in einem Spiel simulieren
 
such mal nach mouse_event hier Hier im Forum suchenmouse_event oder hier MSDN-Library durchsuchenmouse_event

tweetymr 29. Mär 2007 11:19

Re: Virtuellen Klick in einem Spiel simulieren
 
Sorry, aber irgendwie steh ich grade auf dem schlauch :gruebel:
Ich will den Klick virtuell in einer anderen Anwendung erzeugen. Soll heißen: ich mache etwas an meinem Computer und im hintergrund wird der Klick in dem Fenster erzeugt, obwohl ich mit der Maus keine Ausschweifungen mache.
Mit den Tastendrücken funktioniert es einwandfrei.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var W: HWnd;
begin
laenge := length(Edit1.Text);
lol := Edit1.Text;
W := FindWindow(nil,'Anwendung');
Windows.SetFocus(W);
if W <> 0 then
begin
  PostMessage(W, wm_KeyDown, VK_Tab, 0);
  PostMessage(W, wm_KeyUp, VK_Tab, 0);
  for i := 1 to laenge do
  begin
  PostMessage(W, wm_CHAR, ord(lol[i]),0);
  end;
  for i := 1 to 3 do
  begin
  PostMessage(W, wm_KeyDown, VK_Return, 0);
  PostMessage(W, wm_KeyUp, VK_Return, 0);
  if i <> 3 then
  sleep(2000);
end;
end;
end;
Aber wenn ich jetzt das ganze mit meiner Klick-VErsion versuche springt der Cursor immer zu der Stelle die ich ihm angegeben hab:
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var
X,Y:Integer;
W: HWnd;
begin
  W := FindWindow(nil,'Anwendung');
  Windows.SetFocus(W);
  if W <> 0 then
  begin
    X := 770;
    Y := 636;
    SetCursorPos(X, Y);
    mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
    sleep(13000);
  end;
end;
Wie gesagt, ich stehe grade so richtig auf dem Schlauch^^
Wie kann ich das mit den Klicks realisieren?

Gruber_Hans_12345 29. Mär 2007 11:32

Re: Virtuellen Klick in einem Spiel simulieren
 
axo, die anwendung ist im hintergrund ... dann gehts mit dem mouse_event nicht, das simuliert die maus, und dazu muß die anwendung im vordergrund sein.

ich glaube wenn die anwendung im hintergrund ist, und du keinen Handle davon hast, kannste keinen Klick simulieren.
Bekommste bei der FullScreen Anwendung nicht den Handle auch ganz normal?

Wenn du den Handle hast, kannste probieren die MouseEvents per PostMessage zu senden (wie du es mit den Key Events gemacht hast) ... kommt halt dann auch auf die Anwendung drauf an, wie, ob und auf welche Messages die dann reagiert

tweetymr 29. Mär 2007 11:40

Re: Virtuellen Klick in einem Spiel simulieren
 
Zitat:

Zitat von Gruber_Hans_12345
Bekommste bei der FullScreen Anwendung nicht den Handle auch ganz normal?

Wie meinst du das? oO
Ich weiß nicht ob ich das Fenster Handle habe... is das nicht das unten bei den Tasks?^^ Dann hätte ich es
Wie könnte ich das dann machen? mir fällt grade rein garnix ein :cry:

Schonmal danke für deine Geduld^^

tweetymr 30. Mär 2007 10:52

Re: Virtuellen Klick in einem Spiel simulieren
 
ok ich hab hier jetzt was im netz gefunden (hoffe ich zumindest) :roll:
Delphi-Quellcode:
MouseInputStruct.dx := MCord.X;
  MouseInputStruct.dy := MCord.Y;
  MouseInputStruct.mouseData := 0;
  MouseInputStruct.dwFlags := MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN;
  MouseInputStruct.time := 0;
  MouseInputStruct.dwExtraInfo := 0;

  InputStruct.Itype := INPUT_MOUSE;
  InputStruct.mi := MouseInputStruct;

  si := SizeOf(InputStruct);
  SendInput(1,InputStruct,si);

  MouseInputStruct.dx := MCord.X;
  MouseInputStruct.dy := MCord.Y;
  MouseInputStruct.mouseData := 0;
  MouseInputStruct.dwFlags := MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP;
  MouseInputStruct.time := 0;
  MouseInputStruct.dwExtraInfo := 0;

  InputStruct.Itype := INPUT_MOUSE;
  InputStruct.mi := MouseInputStruct;

  SendInput(1,InputStruct,SizeOf(InputStruct));
Jetzt stellt sich mir nur eine frage: Um was geht es bei MouseInputStruct? :oops: :lol:
Hab gegooglet aber nich wirklich viel rausgefunden

Bitte um eure Hilfe :wall:

tweetymr 1. Apr 2007 10:54

Re: Virtuellen Klick in einem Spiel simulieren
 
Will mir hier keiner helfen (außer Gruber_Hans_12345 am anfang)?? :cry: :cry: :cry: :wiejetzt:

DGL-luke 1. Apr 2007 11:35

Re: Virtuellen Klick in einem Spiel simulieren
 
Hallo, was funktioniert denn nicht? du kannst wohl auch WM_MOUSE* nachrichten senden.

Robert Marquardt 1. Apr 2007 11:50

Re: Virtuellen Klick in einem Spiel simulieren
 
Es liegt im wesentlichen daran das du dich nicht ausdruecken kannst.
Eine Full Screen Anwendung (vermutlich DirectX) liegt ueblicherweise nicht im Hintergrund.
Einer im Hintergrund stehenden Anwendung Mausklicks per Message zu senden ist ist problematisch, da mit einem Mausklick ueblicherweise der Fokus wechselt.
Es kann gut sein das das die Anwendung nicht verkraftet oder ungefragt in den Vordergrund kommt.
mouse_event generiert ein Mausereignis als ob es von der Maus kommt.

tweetymr 16. Apr 2007 13:23

Re: Virtuellen Klick in einem Spiel simulieren
 
Sorry das ich mich so lange nicht mehr gemeldet hab :p

naja, mit der methode die ich am anfang gepostet hab, kann ich auf jeden fall schonmal zeichen an das Spiel schicken. Auch WÄHREND dessen ich was anderes mache (also das fenster im hintergrund läuft)

Nur irgendwie will das nicht mit der mouse funktionieren.
Wenn ich mich nicht klar genug ausgedrückt habe, hier nochmal meine Bitte: Wie kann ich die mouse virtuell bewegen und klicken lassen, obwohl das fenster nicht im vordergrund ist? denn mit Keys hab ichs schon hinbekommen.... Hoffe das ist einleuchtender^^

Und entschuldigung das ich euch so viel zeit koste :P

RXR-Max 16. Apr 2007 15:00

Re: Virtuellen Klick in einem Spiel simulieren
 
http://www.delphipraxis.net/internal...t.php?t=107940

ich hatte ein ähnliches problem. ich wollte das die maus einen klick simuliert wenn ich über einer bestimmten farbe bin. das funktioniert in jeder anderen anwendung ich habs ja ausprobiert! was nachher rausgekommen ist musst du einfach ein bischen umschreiben (der letzte beitrag mit dem beispielcode auf seite 3) damit die maus halt nicht auf farbe reagiert sondern auf das ereignis deiner wahl. viel glück...

tweetymr 16. Apr 2007 15:51

Re: Virtuellen Klick in einem Spiel simulieren
 
Aber brauch ich da nicht auchden fokus auf dem entsprechenden fenster?
Und ich will ja mit der maus nebenher was anderes machen, also darf diese nich "wirklich" wandern^^

oder hab ich deinen code falsch interpretiert?
und wie funktioniert das mit der WM_MOUSE* Anweisung wie DGL-luke meinte?

Apollonius 16. Apr 2007 16:45

Re: Virtuellen Klick in einem Spiel simulieren
 
Du kannst an das Handle eines Buttons auf jeden Fall eine BM_Click-Nachricht schreiben- schau einfach mal in der Delphi-Hilfe.
Außerdem gibt es noch die Möglichkeit, direkt das Parent zu informieren:
dsdt

cruiser 16. Apr 2007 17:27

Re: Virtuellen Klick in einem Spiel simulieren
 
Laut WinAPI:

Code:
PostMessage(HWND, [color=#ff0000]*[/color]WM_LBUTTONDOWN, [color=#00ff00]*[/color]0, MakeLParam(Pos.X, Pos.Y));

[color=#ff0000]*[/color] Maustastenaktion - Mögliche Werte:
WM_LBUTTONUP
WM_LBUTTONDOWN
WM_LBUTTONDBLCLK
WM_RBUTTONUP
WM_RBUTTONDOWN
WM_RBUTTONDBLCLK
WM_MBUTTONUP
WM_MBUTTONDOWN
WM_MBUTTONDBLCLK

[color=#00ff00]*[/color] Zusätzlich gedrückte Taste(n) - Mögliche Werte:
MK_CONTROL
MK_LBUTTON   
MK_MBUTTON   
MK_RBUTTON   
MK_SHIFT   
oder or-Verknüpfungen von mehreren

willnix 16. Apr 2007 18:25

Re: Virtuellen Klick in einem Spiel simulieren
 
Dein Probelem ist, dass alle dein bisherigen Methoden auf eier neu Positionierung des Mauszeigers und einem anschließenden Klick basieren.
Du solltest einfach mit WinSpy das Handle des entsprechenden Buttons (oder was auch immer) suchen und dies dann in deinen Code übernehmen.
Jetzt kannst du dann mit SendMessage die Messagees WM_LBUTTONUP und WM_LBUTTONDOWN (infos in der MSDN) wie schon von anderen vorgeschlagen an die entsprechende Komponente schicken.
Eventuel musst du dann direkt danach eine Funktion einbauen um das Fenster wieder zu minimieren, denn es könnte eventuell den Fokus auf sich ziehen wenn du einen Klick simulierst.
Willnix

tweetymr 16. Apr 2007 23:37

Re: Virtuellen Klick in einem Spiel simulieren
 
also ich hab kein Handle für einen Button rausfinden können. Nur das Handle für das fenster.
Das hab ich raus bekommen:
Klasse: l2UnrealWWindowsViewportWindow
Handle: 197618
Window Handle: 0x000303F2

Bringt mich das irgendwie weiter? :zwinker:

cruiser 17. Apr 2007 15:42

Re: Virtuellen Klick in einem Spiel simulieren
 
Probier doch einfach den Klick an das Window-Handle zu senden... sprich ein Down und ein Up. Beachte aber, dass du mit absoluten und nicht mit relativen koordinaten auf das fremde Fenster klickst.

Apollonius 17. Apr 2007 15:47

Re: Virtuellen Klick in einem Spiel simulieren
 
Wie hast du nach dem Button gesucht? Mit findwindowex()? Mit welchen Parametern (es gibt die Klasse Button, die Klasse TButton...)?

tweetymr 17. Apr 2007 17:47

Re: Virtuellen Klick in einem Spiel simulieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
@cruiser:
Wie meinst du das mit den absoluten koordinaten? Wie sieht das aus? oO

@Apollonius:
Ich hab garnicht danach gesucht, ich hab das mit WinSpy (wie empfohlen) gemacht.
Kann mal nen screen anhängen, was WinSpy dazu zu sagen hat. Achso: Wenn ich da dann auf code generieren gehen, kann ich ewig warten und kommt doch kein ergebnis :S

willnix 17. Apr 2007 20:28

Re: Virtuellen Klick in einem Spiel simulieren
 
Hast du dir mal alle Childs dieses Fensters anzeigen lassen, oder mal versucht linage mit irgendeinem parmater oder so in nem Fenster zu starten, dann kannst du mit WinSpy vlt. doch das Handle des Buttons finden.
Willnix

tweetymr 17. Apr 2007 20:34

Re: Virtuellen Klick in einem Spiel simulieren
 
also ich hab da leider keine childs finden können :gruebel: :wall:
wie meinst du das mit den parametern?
Sorry für meine nervigen fragen :oops: :duck:

Nuclear-Ping 18. Apr 2007 11:07

Re: Virtuellen Klick in einem Spiel simulieren
 
[OT]
Och nö, nich noch n LineAge-Bot ... :roll:
[/OT

tweetymr 18. Apr 2007 11:34

Re: Virtuellen Klick in einem Spiel simulieren
 
[OT]
hmm ok aufklärung
1. Das Spiel heißt Lineage nicht LineAge und somit auch nicht Line Age!
2. Das Programm dient nur zu "forschungszwecken" in der schule und das auf legalem wege und ohne irgendwelche rechte zu verletzen

also könnte man bitte diese contraproduktiven beiträge bei seite lassen?
[/OT]

Nuclear-Ping 23. Apr 2007 16:43

Re: Virtuellen Klick in einem Spiel simulieren
 
[OT]
Stimmt, es heisst "Lineage" und wird "Liniage" gesprochen. Ich habs auch mal gezockt. "LineAge" is halt so'ne Angewohnheit ... ;)

Ob solche Beiträge Kontraproduktiv sind, bleibt dem Betrachter überlassen. Ich hab's extra mit [OT] als Off-Topic gekennzeichnet und es spiegelt nur meine pers. Meinung wider.

"Legal" und "in der Schule" klingt zwar harmlos, aber ob es das auch ist bleibt fraglich. Die "meisten" (soviel gibts ja auch nicht) Hersteller solcher Spiele verklausulieren in ihren AGB und EULAs meist, dass die Manipulation / Automatisierung von Abläufen des Spiels von (externen) Dritt-Anbieter-Programmen verboten ist. Blizzard hat da für WoW extra ein Tool im Hintergrund laufen, welches Protokolliert, was für Fremdprogramme mit den Handles von WoW rumhanteln. ;)
[/OT]

willnix 23. Apr 2007 20:41

Re: Virtuellen Klick in einem Spiel simulieren
 
Also um jetzt mal beim Thema zu bleiben, ich glaube da siehts ziemlich schlecht aus.
Handles für Buttons usw. konnte ich bei einem anderen Spiel mit der gleichen Engine nicht finden.
Du könntest das Spiel kurz in den Vordergrund holen und dann eben an der passenden Stelle einen Klick simulieren.
Aber sonst fällt mir auch keine Lösung ein.
Willnix

brechi 23. Apr 2007 21:41

Re: Virtuellen Klick in einem Spiel simulieren
 
tweety laber net so nen Müll, dann steh wenigsten dazu. Hier mag es keiner wenn rumgelogen wird.
Lineage II ist eben das Online-Spiel Line Age, da dieses ganz zufällig auf der Unreal Engine basiert und oh siehe da, die Fensterklasse einen ähnlichen Namen hat. Dann das icon und such mal bei google nach l2UnrealWWindowsViewportWindow.

Und rumlügen bei 11 Posts is echet ner gerade toll, besonders weil es ja für die Schule sein soll - klar. Skript Kiddies brauch man hier auch nicht. Such lieber in einem Cheaterforum da wurde sowas schon 1000 mal beantwortet.

Hättest die Wahrheit gesagt würd ich dir ja sagen wie es geht, so bekommst nur nen Tip wo mans findet.


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