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 user profile iconChristian 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?


jaenicke - Mo 21.04.08 13:40

user profile iconamazing hat folgendes geschrieben:
E: Damit ich besser weiter komme: was bedeutet die 0 und was bedeutet WM_SETTEXT?
http://msdn2.microsoft.com/en-us/library/ms632644(VS.85).aspx ;-)


amazing - Di 22.04.08 15:27

Kannst du mir sagen, wie ich den Enter-testendruck simulieren kann?


jaenicke - Di 22.04.08 20:13

http://delphi.about.com/od/adptips2004/a/bltip1104_3.htm
Das sollte dir helfen ;-).


toms - Di 22.04.08 20:32

user profile iconamazing hat folgendes geschrieben:
Kannst du mir sagen, wie ich den Enter-testendruck simulieren kann?


Google ist dein Freund!

Einfach mal folgende Suchwörter eingeben:

Suche bei Google 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); // internal function
    end;
  end;


Moderiert von user profile iconNarses: 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?


jaenicke - Mo 12.05.08 19:20

Was meinst du damit? Die Funktion gibt dir das Handle des Fenster zurück, das gerade den Eingabefokus besitzt:
Suche bei Google GETFOREGROUNDWINDOW
-->
http://msdn.microsoft.com/en-us/library/ms633505(VS.85).aspx


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

user profile iconamazing 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?