Entwickler-Ecke
Windows API - Kann Delphi auf externe Fenster zugreifen?
amazing - Fr 18.04.08 16:27
Titel: Kann Delphi auf externe Fenster zugreifen?
Hallo, ich hab Delphi seit einiger Zeit in der Schule und interessiere mich privat auch dafür.
Kann Deplphi, im Hintergrund laufend, auf ein externes Fenster 'zugreifen' z.B Editor und eine Textnachricht in Zeitabständen, welche z.B durch ein Editfeld vorgegeben werden kann, senden?
Der Timer würde sich ja dafür gut eigenen, aber wie bekomme ich Delphi dazu, das oben beschriebene zu amchen?
Moderiert von
Christian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 18.04.2008 um 18:00
Der nette Nachbar - Fr 18.04.08 16:33
Informiere dich tiefgehend über API Hooks, danach wirst du dein Problem ohne Mühe bewältigen können. xD
amazing - Fr 18.04.08 17:05
Hm das sagt mir jetzt nichts, hat jemand einen Ansatz für mich?
Sinspin - Fr 18.04.08 17:53
Warum immer alle, naja einige, gleich mit API Hooks um sich werfen müssen, verstehe ich nicht.
Es reicht das Win-API Handle des Fensters zu kennen in das du schreiben willst.
Allerdings kommt dann deine Eingabe immer nur dort an wo gerade der Focus drauf ist (der Eingabecursor steht).
Schau dir mal das an:
http://www.delphi-forum.de/viewtopic.php?t=21271&highlight=fenster
Da findest du eingentlich alles was du brauchst. Ansonsten, einfach mal hier im Forum suchen. (für den einen Link habe ich dir das ja schonmal abgenommen :wink: )
amazing - Fr 18.04.08 18:56
Danke schonmal, nur habe ich soetwas in der Richtung noch nie probiert und bin eigentlich Anfänger.
Wenn ich jetzt dieses Handle habe, was dann?
amazing - Sa 19.04.08 19:16
hm niemand? ist das hier eigentlich der richtige bereich für die frage?
jaenicke - So 20.04.08 05:44
Wenn du ein Handle des Eingabefelds hast, dann kannst du zum Beispiel den Text darin setzen:
Delphi-Quelltext
1:
| SendMessage(TextfieldHandle, WM_SETTEXT, 0, Integer(PChar(DeinString))); |
amazing - So 20.04.08 20:23
Sehr gut, danke!
Wie bekomme ich es hin, dass er nachdem er den Text geschickt hat, die Funktion der Taste Enter durchführt?
E: Damit ich besser weiter komme: was bedeutet die 0 und was bedeutet WM_SETTEXT?
amazing - Di 22.04.08 15:27
Kannst du mir sagen, wie ich den Enter-testendruck simulieren kann?
toms - Di 22.04.08 20:32
amazing hat folgendes geschrieben: |
| Kannst du mir sagen, wie ich den Enter-testendruck simulieren kann? |
Google ist dein Freund!
Einfach mal folgende Suchwörter eingeben:
ENTER SIMULIEREN DELPHI
amazing - Di 29.04.08 15:53
Hab das mit der Entertaste noch nicht hinbekommen, welchen Keycode hat die Taste Enter denn?
Achja, kann Delphi das Handle auch manuell auslesen, sodass ich das Programm nicht immer umprogramieren muss?
jaenicke - Di 29.04.08 15:57
1. 13
2. Delphi nicht, aber dein Programm mit entsprechendem Delphi-Quelltext :P, den Quelltext um ein Fenster zu finden, kann dir dieses Programm automatisch generieren:
http://www.delphi-forum.de/viewtopic.php?t=21271
amazing - Fr 09.05.08 21:40
Ok hab das jetzt Mal gemacht, aber er sagt 'FlashControl' ist unbekannt. Kann das an der Version liegen? aslo ich hab Delphi 4.
jaenicke - Fr 09.05.08 22:02
Wie sieht denn der Quelltext aus?
amazing - Fr 09.05.08 22:11
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var wndMain, wndChild: HWND; begin wndMain := FindWindow('SunAwtFrame','Channel: 8-Ball, Nick: Rayen10'); if wndMain <> 0 then begin wndChild := FindWindowEx(wndMain, 0, 'SunAwtCanvas', nil); wndChild := FindWindowEx(wndChild, 0, 'Edit', nil); if wndChild <> 0 then begin ShowMessage('Window Handle: ' + IntToStr(wndChild)); FlashControl(wndChild); end; end; |
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
jaenicke - Fr 09.05.08 23:33
Das ist doch nur ein Beispielaufruf mit dem gefundenen Handle :lol: .
Das bewirkt in dem Skript dann, dass das Control blinkt. Du musst mit dem Handle eben das machen, was du möchtest. ;-)
amazing - Sa 10.05.08 12:32
Sorry für die vielen Fragen, aber eine hab ich noch ;)
Und zwar hab ich ja jetzt ein ganz bestimmtes Fenster, ich hätte es aber gerne, dass er das aktuell aktivierte nimmt.
toms - So 11.05.08 08:09
GetForegroundWindow liefert dir das Handle vom Fenster im Vordergrund.
amazing - Mo 12.05.08 18:10
wie muss ich das deklarieren?
amazing - Di 13.05.08 00:12
Ah hat sich erledigt.
Gibt es auch eine Funktion, die das Handle des Editfeldes eines aktiven Fensters liefert?
toms - Di 13.05.08 06:38
amazing hat folgendes geschrieben: |
Ah hat sich erledigt.
Gibt es auch eine Funktion, die das Handle des Editfeldes eines aktiven Fensters liefert? |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function 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; |
amazing - Fr 16.05.08 15:30
Danke funktioniert jetzt alles
Hab ein wenig probiert ein Passwort auf einer zweiten form abzufragen, um bei Richigkeit des Passwortes das eigentliche form zu öffnen, bis jetzt leider ohne Erfolg.
Hat da jemand eine Idee für?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!