Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Keybinder - GTA SA (https://www.delphipraxis.net/147614-keybinder-gta-sa.html)

Millencolin 12. Feb 2010 12:56


Keybinder - GTA SA
 
Erstmal einen schönen guten Tag!
Ich versuche derzeit folgendes Programm nachzuprogrammieren: Keybinder

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:
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;
Jedoch erreiche ich dadurch nicht die DirectX Oberfläche sondern verändere lediglich die Caption des Fensters("GTA SA" wird dann zB zu "/enter".
Unter Windows klappt GetSysFocus einwandfrei. Wie erreiche ich es nun dass der String dem EingabeFeld in GTA übergeben wird?

himitsu 12. Feb 2010 13:02

Re: Keybinder - GTA SA
 
Zitat:

Zitat von Millencolin
Jedoch erreiche ich dadurch nicht die DirectX Oberfläche sondern verändere lediglich die Caption des Fensters("GTA SA" wird dann zB zu "/enter".
Unter Windows klappt GetSysFocus einwandfrei. Wie erreiche ich es nun dass der String dem EingabeFeld in GTA übergeben wird?

Das liegt womöglich daran, daß es kein eigenständiges EingabeFeld (Edit) gibt. :zwinker:

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.

Millencolin 12. Feb 2010 13:09

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:/

himitsu 12. Feb 2010 13:24

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:

"t"-Taste drücken
"t"-Taste loslassen
alt-Taste drücken
"ß"-Taste drücken (da wo das "\" drauf ist)
"ß"-Taste loslassen
alt-Taste loslassen
"e"-Taste drücken
"e"-Taste loslassen
...
"r"-Taste drücken
"r"-Taste loslassen
enter-Taste drücken
enter-Taste loslassen
Sowas wie MSDN-Library durchsuchenWM_SETTEXT, MSDN-Library durchsuchenSetWindowText kannst du hier vergessen.

PS: 60 MB (61.355KB) kommt mir für soein Programm ein bissl viel vor. :lol:

Millencolin 12. Feb 2010 13:44

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

Millencolin 14. Feb 2010 11:54

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?

himitsu 14. Feb 2010 12:02

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.

Luckie 14. Feb 2010 13:51

Re: Keybinder - GTA SA
 
Zitat:

Zitat von himitsu
9]PS: 60 MB (61.355KB) kommt mir für soein Programm ein bissl viel vor. :lol: [/size]

Irgendwo muss ja noch der Trojaner und Rootkit Code untergebracht werden. ;)

Millencolin 14. Feb 2010 15:11

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

himitsu 14. Feb 2010 15:29

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:

luckie lese erstmal das thema bevor du sone behauptung verbreitest.
Das war als Scherz gemeint.
(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: )

Millencolin 14. Feb 2010 15:40

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:(

himitsu 14. Feb 2010 16:00

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?

Millencolin 14. Feb 2010 16:22

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.

himitsu 14. Feb 2010 17:18

Re: Keybinder - GTA SA
 
Wieso umständlich?

Hast du dir denn mal das SendKey oder Dergleichen angesehn?
http://www.delphipraxis.net/internal...ct.php?t=85418

Millencolin 14. Feb 2010 19:21

Re: Keybinder - GTA SA
 
ja ich kenne mich mit tastensimulationen aus^^ is kein neugebiet;)

Astat 14. Feb 2010 21:45

Re: Keybinder - GTA SA
 
Zitat:

Zitat von Millencolin
ja ich kenne mich mit tastensimulationen aus^^ is kein neugebiet;)

Na dann,...

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.

Millencolin 14. Feb 2010 22:18

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?:)

Astat 14. Feb 2010 22:30

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

Astat 14. Feb 2010 22:48

Re: Keybinder - GTA SA
 
Zitat:

Zitat von Millencolin
Inwiefern hilft mir die procedure weiter?:)

Rufst Du mit einem Hotkey, oder in einer Hook-Dll auf, und schon hast Du den schönsten Keybinder.

HookDll, guckst du da!

http://www.delphipraxis.net/internal...835&highlight=

lg. Astat

Millencolin 14. Feb 2010 23:03

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

Valle 14. Feb 2010 23:24

Re: Keybinder - GTA SA
 
Zitat:

Zitat von Millencolin
das ist meiner meinung nach kein guter programmierstil [...] wenn ich unbedingt tasten simulieren wollte könnte ich auch den zwischenspeicher nutzen.

Das ist schlechter Programmier-Stil. Ein Programm, welches sich an meiner Zwischenablage zu schaffen macht, fliegt direkt wieder runter. Das ist Gebiet des Users und hat nicht (völlig unnötiger Weise) von Programmen verändert zu werden. :roll:

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

Millencolin 15. Feb 2010 15:34

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 18:55 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