![]() |
Keybinder - GTA SA
Erstmal einen schönen guten Tag!
Ich versuche derzeit folgendes Programm nachzuprogrammieren: ![]() Grundgedanke: Bei GTA SanAndreas gibt es einen inoffiziellen Multiplayer Modus. Viele Aktionen laufen über Befehle ab wie zum Beispiel "/enter" zum betreten eines bestimmten Gebäudes. Über "t" öffnet man ein Feld in der man diese Befehle eingeben kann. Um die Schreibarbeit zu minimieren gibt es Keybinder(s.o) die für mich den tastendruck "t" simulieren -> den eingespeicherten String an das durch "t" geöffnete Feld übergeben -> Enter-Taste simulieren um zu bestätigen Bisher nutzte ich GetSysFocus um das Handle des aktuellen Fensters zu erhalten.
Delphi-Quellcode:
Jedoch erreiche ich dadurch nicht die DirectX Oberfläche sondern verändere lediglich die Caption des Fensters("GTA SA" wird dann zB zu "/enter".
function TForm1.GetSysFocus: HWND;
var ThreadID, CurrThrId: cardinal; begin Result := 0; ThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil); CurrThrId := GetCurrentThreadId; if ThreadID <> CurrThrId then begin if AttachThreadInput(ThreadID, CurrThrId, true) then begin Result := GetFocus; AttachThreadInput(ThreadID, CurrThrId, false); end; end else Result := GetFocus; end; Unter Windows klappt GetSysFocus einwandfrei. Wie erreiche ich es nun dass der String dem EingabeFeld in GTA übergeben wird? |
Re: Keybinder - GTA SA
Zitat:
Diese Anwendung zeichnet dieses "virtuelle" Eingabefeld nur als Grafik. Eingaben gehen weiterhin an die Anwendung und bei dieser kommt es darauf an, wie sie die eingegebenen Tasten ausließt, denn an diese Schnittstelle muß man dann die gewünschten "simulierten" Tastenanschläge schicken. PS: Einige Programme unterbinden z.B. vorallem die einfachen Wege, wie z.B. WM_KEY und Co. Dieses soll das Cheaten erschweren. |
Re: Keybinder - GTA SA
meinst du dass ich beispielsweise für den befehl /enter folgende tasten simulieren muss: "t"->"/"->"e"->"n"->"t"->"e"->"r"->"Enter" ?
Das würde dann über DirectInput anlaufen oder? PS: irgendwie gefällt mir der Gedanke nicht solche umwege zu laufen:/ |
Re: Keybinder - GTA SA
Der einfache Weg:
Schau mal nach SendKey und versuch die Tasten global zu senden, dann landen sie beim "aktiven" Programm und mit viel Glück ließt GTA diese Schnittstelle ja aus. Und ja, egal was du machst, am Ende müssen die Tasten so oder so bestimmt einzeln gesendet werden. Wobei es eher so enden wird: Zitat:
![]() ![]() PS: 60 MB (61.355KB) kommt mir für soein Programm ein bissl viel vor. :lol: |
Re: Keybinder - GTA SA
hmm bin noch nicht ganz überzeugt von der technik:D
zum beispiel kann jedes spiel doch auch die zwischenablage nutzen. gibt es nicht einen weg darüber der geeigneter ist? weil dieses tastensimulation erscheint mir sehr begrenzt in seiner wirkungsweise. PS: ja da gibt die seite falsche infos raus. da programm ist nur 60kb groß^^ da wollte wohl jemand die größe in byte angeben:D |
Re: Keybinder - GTA SA
Niemand anwesend der mir helfen kann? :gruebel:
Im prinzip geht es doch nur um eine simple informationsweitergabe...aber wie sende ich diese an eine DirectX anwendung? |
Re: Keybinder - GTA SA
Ganz im Ernst, dieses war noch die Beschreibung eines einfachen Weges.
Alle Programme empfangen die Tasten einzeln, also kannst du sie auch nur einzeln senden. Hast du denn mal nach SendKey geschaut? Diesem gibt man z.B. einen String, es zerlegt ihn und versendet dann die einzelnen Tastencodes. |
Re: Keybinder - GTA SA
Zitat:
|
Re: Keybinder - GTA SA
himitsu du verstehst glaube nicht was ich will. der string soll eben nicht zerlegt werden. das ist meiner meinung nach kein guter programmierstil es über die simulation von tastendrücken zu realisieren.
luckie lese erstmal das thema bevor du sone behauptung verbreitest. Wie bereits gesagt das Programm ist 60kb groß nicht 60mb;) und nen trojaner hätte keine größe von 60mb:D |
Re: Keybinder - GTA SA
Was ist daran kein guter Programmstiel?
Wie gibst du diese Text/Befehl selber ein? Genau, Taste drücken, Taste loslassen, nächste Taste drücken, Taste loslassen, ... Und genau das muß dann auch dein "simulieren". Sei es nun durch deinen eigenen Code oder über Funktionen/Komponenten wie SendKey ... was glaubst du denn, daß ich ständig auf sowas verweise? Es ist nunmal nicht so, daß man hier in dem gewünschten Programm ein bestimmtest Control vorfindet, welches so wie ein Edit eine schöne Schnittstelle (z.B. ala SendMessage+WM_SETTEXT oder SetWindowText) bietet. Zitat:
(da bin ich mir relativ sicher und zur Klarstellung, ich wußte auch vorher schon, daß diese 60 MB nicht stimmen konnten und was Kleineres gemeint war :zwinker: ) |
Re: Keybinder - GTA SA
warum es meiner meinung nach schlechter programmierstil ist? weil wenn ich unbedingt tasten simulieren wollte könnte ich auch den zwischenspeicher nutzen. den angeforderten string dort unterbringen und "strg" + "v" simulieren lassen. damit knnte ich dann auch sicher stellen dass der string beliebig verändert werden kann und es wäre wesentlich allgemeiner formuliert. aber ich will eigentlich nicht unnötig viele tasten simulieren. "t" zum öffnen und "enter" zum bestätigen reichen und lassen sich auch nciht umgehen.
PS: sry luckie aber der comment war nicht sehr konstruktiv:( |
Re: Keybinder - GTA SA
Dann mußt du aber immernoch einige Tastenanschläge simulieren
und das andere Programm muß dieses Kopieren ebenfalls unterstützen (wobei du hierbei eventuell glück haben könntest). PS: Wenn soein Hilfsprogramm dann ständig unnötig meine Zwischenablage zerschießt, dann fänd ich das nicht nett. PSS: Wenn du also eh Tasten simulieren mußt, wozu dann zusätzlich noch einen weiteren Weg implementieren, wenn doch schon der erste Weg alle nötigen Möglichkeiten bietet? |
Re: Keybinder - GTA SA
Die zwischenablage wird von fast allen programmen unterstützt.
der user soll selbst entscheiden können welche befehle auf den tastenkombinationen liegen. insofern stelle ich mir den quelltext um alle möglichkeiten abzugreifen recht umständlich vor. Ich bin kein blutiger Anfänger beim programmieren und habe mich hier ans Forum gewand weil ich eben nicht über die zwischenablage gehen will und auch nicht unnötig viele tastensimulationen verwenden will. |
Re: Keybinder - GTA SA
Wieso umständlich?
Hast du dir denn mal das SendKey oder Dergleichen angesehn? ![]() |
Re: Keybinder - GTA SA
ja ich kenne mich mit tastensimulationen aus^^ is kein neugebiet;)
|
Re: Keybinder - GTA SA
Zitat:
Delphi-Quellcode:
//-- EDIT: procedure SendText(ptrData: Pointer; cbLen: Integer); procedure SendText(ptrData: Pointer); var ptrByte: PByte; bShift: Boolean; begin ptrByte := ptrData; while ptrByte^ <> 0 do begin bShift := False; if ((ptrByte^ > $40) and (ptrByte^ < $5B) ) then begin bShift := True; keybd_event(VK_SHIFT, 0, 0, 0); end; if ((ptrByte^ > $60) and (ptrByte^ < $7B)) then begin keybd_event(ptrByte^ - $20, 0, 0, 0); keybd_event(ptrByte^ - $20, 0, KEYEVENTF_KEYUP, 0); end else begin keybd_event(ptrByte^, 0, 0, 0); keybd_event(ptrByte^, 0, KEYEVENTF_KEYUP, 0); end; if bShift then keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); inc(ptrByte); end; end; begin SendText(PChar('Hello world ')); end. |
Re: Keybinder - GTA SA
Erstmal ne Frage: welche funktion hat der übergebene Parameter cbLen? ich denke mal Len steht für Length aber welche länge und warum wird er nicht benutzt?
Inwiefern hilft mir die procedure weiter?:) |
Re: Keybinder - GTA SA
Hallo Millencolin, der ist bei der Strg + C Aktion nicht rausgeflogen.
Vergiss ihn, den brauchst bei Übergabe als PChar nicht. lg. Astat |
Re: Keybinder - GTA SA
Zitat:
HookDll, guckst du da! ![]() lg. Astat |
Re: Keybinder - GTA SA
schuldige habe nen teil vom quelltext einfach überlesen^^
ich nutze fürs erste hotkeys...hatte mir hooks auch schonmal angeschaut jedoch dann von der anwendung abgeschreckt weil ich ja beim user durch eine AntiViren meldung kein Misstrauen säen will:) ich probiere erstmal ein wenig mit deiner procedure rum und melde mich dann morgen wieder;) PS: danke schonmal an himitsu und astat für die in anspruch genommene zeit |
Re: Keybinder - GTA SA
Zitat:
Das Aufspalten von Kommandos in einzelne Tastendrücke hat nichts mit schlechten Stilen zutun. Programmieren war schon immer eine Tätigkeit, bei der man alle Vorgänge bis ins kleinste aufspaltbare Detail beschreiben muss. Das Senden einer Taste ist nunmal ein Aufwand von Taste drücken und Taste loslassen, so ist das nunmal. Oftmals haben Andere schon den Kleinkram für dich gemacht (BIOS, OS, Win32 API). Und diesmal musst du eben auf SendKey zurückgreifen oder selbst was machen. ;-) Liebe Grüße, Valle |
Re: Keybinder - GTA SA
Ich will den Zwischenspeicher ja auch nicht nutzen weil mein Programm da nicht unbedingt was zu suchen hat.
Das lässt sich aber auch aus meinem Beitrag herauslesen. Die Tastensimulation war mir als Möglichkeit auch schon bekannt aber ich wollte eben mit Hilfe eurer Kenntnisse eine andere Möglichkeit finden. Ich weiß auch um was es beim Programmieren geht^^ Wie gesagt ich habe eben nach einer anderen möglichkeit gesucht, als nur Tasten simulieren zu lassen. Wenn du an den Anfang meines Beitrags zurück gehst wirst du feststellen dass ich zum Beispiel das ganze schon über das Handle versuch habe zu realisieren aber eben nicht auf die DirectX oberfläche komme. Das war mein Ansatzpunkt. Wenn du Interesse hast mir zu helfen kann ich dir auch gerne ein provisorischen Quelltext von mir übergeben, in dem meine bisherige Arbeitsweise vllt deutlicher erkenntlich wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz