Autor Beitrag
error
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 01.11.02 23:39 
Hi,
ich möchte gerne einen Tastendruck (z.B. Strg+C) an ein anderes Programm senden. Wie geht das (bei vb heisst das SendKey()...)

thxia error

PS: Wenns geht bitte mit Beispiel


Moderiert von user profile iconTino: Topic aus Sonstiges verschoben am Fr 04.02.2005 um 01:47
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.11.02 00:22 
Google mal nach SendKey und Unit
error Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Sa 02.11.02 00:37 
Sorry hab nicht damit gerechnet dass das bei Delphi auich so heisst...
was ist jetzt gefunden habe ist "SendKeys (0, ‘%b‘, True);"... die Frage ist wie sage ich Delphi welches Programm das Empfangen soll?
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.11.02 00:57 
Das Fensterhandle

Mit FindWindow suchst du das Fenster und bekommst ein Handle zurück wenn Fenster da ist.

Beispiel:

var
H: Integer
begin
H:=FindWindow(nil, pchar('Fenstername'));
...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.11.02 06:57 
Mit Strg+C kopierst du den Inhalt eiens Edits in die Zwischenablage. Ihr müßt euch endlich mal davon lösen fremde Programm per Programm so "steuern" zu wollen, als ob ihr selber vor dem Bildschirm sitzt. Ihr müßt so anfangen wie Windows zudenken und zu handlen. Dazu ist natürlich ein tieferes Verständnis nötig, wie Windows überhaupt funktioniert.

Also mal ganz kurz und sehr unvollständig: Windows kommuniziert mit den Programmen (welche Fenster sind) über Nachrichten. Soll ein Fenster was machen bekommt es von Windows eine Nachricht geschickt. Das Fenster (Programm) holt sich diese Nachricht ab und bearbeitet sie (wenn es der Programmierer will und entsprechenden Code im Programm vorgesehen hat).
Anderst wiederum können auch Programme (Fenster) selber Nachrichten schicken. Klickt der Benutzer in einem Programm zum Beispiel auf einen Button, schick Windows an das übergeordnete Fenster, also an das Fenster auf dem der Button sitzt, man spricht vom Parent(-Fenster) eine sogenannte Notify-Nachricht, in diesem Fall BN_CLICKED, welche das Parent darüber informiert, das ein Button angeklickt wurde. Das Parent fängt jetzt die Nachricht WM_COMMAND ab in dessen Parametern der Notify-Code (BN_CLICKED) und der Auslöser (unser Button) übergeben wird. So damit Windows jetzt weiß von wem eine Nachricht kommt bzw umd gezielt einem Fenster (auch Buttons und Edits sind Fenster) eine Nachricht zukommen zu lassen, vergibt Windows an alle Fenster eine Kennziffer (Handle) mit Hilfe welcher es jedes Fenster eindeutig identifizieren kann.

So, will ich jetzt in einen fremden Programm auf einen Button klicken, simulier ich nicht einen Mausklick auf den Button, was auch möglich wäre, sondern schicke an das Parent des Buttons die Windows-Nachricht, die auch Windows an das Parent schicken würde, wenn jemand wirklich auf den Button geklickt hätte. Nämlich entweder ein WM_COMMAND mit dem Bezeichner des Buttons, der ID (nicht dem Handle, die ID wird Programm intern vom Programmierer vergeben) oder ich schicke an den Button direkt ein BM_CLICK welche wiederum eine WM_COMMAND-Nachricht mit dem entsprechenden Bezeichner auslöst.
Leseempfehlung: Fenster- und Button-Tutorial aus meinen nonVCL-Tutorials
(Link)

Ok, so weit alles klar? Gut, machen wir weiter. Als nächstes wollen wir in ein fremdes Edit reinschreiben. Auch hier lösen wir uns von der Vorstellung Tastendrücke simulieren zu wollen, als wenn wir selber da reinschreiben täten. Wir mache es so wie Windows und senden die entsprechende Nachricht an das Fenster, nämlich WM_SETTEXT. WM_SETTEXT erwartet unter anderem den Text, der in das Edit geschrieben werden soll als Parameter.
Leseempfehlung: Edit-Tutorial aus meinen nonVCL-Tutorials.
(Link)


So, du willst jetzt Text in die Zwischenablage kopieren also schicke die entsprechende Nachricht an das Fenster. Die wäre in diesem Fall WM_COPY.
Dazu brauchst du das Handle des Fensters. Vorgehen beim Notepad:

  • mit FindWindow Hauptfenster suchen
  • mit FindWindowEx das Handle vom Edit vom Notepad erhalten
  • alternativ geht auch GetDlgItem, wenn die ID des Edits bekannt ist (läßt sich mit Tools rausfinden)
  • mit SendMessage WM_COPY an das Edit schicken


Zu allen hervorgehoben Funktionen solltest du was hier im Forum finden. Desweitern sollten dir die empfohlenen Tutorials weiterhelfen.
en!gma
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Fr 11.02.05 23:36 
hmm nachdem ich wörter gefunden hab, die ich der suche gefunden hab, welche ich in der suche davor gefunden hab usw ^^
bin ich schliesslich auf diesen thread gestossen...
naja is schon ziemlich alt, aber ich dachte mir bevor ich neuen thread aufmach, versuch ichs hier einfach mal ;D

also
@ luckie

das war erstmal ne kleine sehr gute lektüre ;D
wieder was dazugelernt.
aber nun wollt ich mal fragen, wie das ganze eigentlich in spielen aussieht?
sind da auch handles, wo ich zB text einfügen kann?
in die console zB?

wie finde ich diese handles raus?
habs zwar mit WindowInfo versucht, aber das spiel wird immer minimiert, wenn ich versuche es auszulesen

und wie sieht das eigentlich mit den tutorials aus?
haste die noch?
weil der link ist ja schon ein wenig älter und funzt nicht mehr : /
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 11.02.05 23:39 
Die Tutorials findes du hier: tutorials.luckie-online.de
en!gma
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Fr 11.02.05 23:44 
ahh ok thx
ich werd mal durchschaun