Autor Beitrag
nove
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 07.02.05 15:07 
hallo!

mein programm sollte unter anderem die funktion erfuellen, dass es, dort wo der cursor positioniert ist, in regelmaessigen abstenden per Sendkeys-komponente und befehl einen text reinschreibt.
Ich will das ganze aber ein wenig erweitern, und dem programm begreiflich machen, dass es sich merkt in welches textfeld (von einem externen programm) es die texte senden soll.. so dass wenn z.b. ein popup aufgeht, und der cursor nicht mehr in dem textfeld aktiv ist, immernoch dorthin sendet.
ich habe einiges von "handle" gelesen, aber ich check das irgendwie nicht.. hat da wer vl. einen kleinen code oder so? wie man das gerade aktive fenster ausliest ? .. das Textfeldes des externen programmes, wo es reinschreiben soll, ist uebrigens immer das selbe.. es waere also auch moeglich, dass man die "position" des textfeldes des einen programmes auch fest in mein programm integriert.. nur hab ich keine ahnung wie ich das anstellen soll.. hat da wer eine idee?
ist ueberhaupt klar, was ich meine..??

wuerd mich ueber hilfe freuen.

mfg
nove


Moderiert von user profile iconTino: Topic aus Sonstiges verschoben am Di 08.02.2005 um 09:24
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 08.02.05 05:12 
Du kannst mit FindWindow, FindWindowEx, EnumWindow & EnumChildWindows das benötigte Fensterhandle suchen und dann z.B. mit SendMessage und der Nachricht WM_SETTEXT einen Text in das Textfeld schreiben. Ich hab' dir mal ein Beispiel mit dem Notepad geschrieben.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
procedure TForm1.Button1Click(Sender: TObject);

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  begin
    TList(lParam).Add(Pointer(hWnd));
    Result := True;
  end;

var
  SI: TStartupInfo;
  PI: TProcessInformation;
  List: TList;
  I: Integer;
  AppHWnd: HWND;
  EditHWnd: HWND;
  ProcessId: DWORD;
begin

  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb := SizeOf(TStartupInfo);
  if CreateProcess(nil'notepad.exe'nilnil, False, 0nilnil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, INFINITE);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
    List := TList.Create;
    try
      EnumWindows(@EnumWindowsProc, LPARAM(List));
      for I := 0 to List.Count - 1 do
        if GetWindowThreadProcessId(HWND(List.Items[I]), @ProcessId) <> 0 then
          if ProcessId = PI.dwProcessId then
          begin
            AppHWnd := HWND(List.Items[I]);
            EditHWnd := FindWindowEx(AppHWnd, 0'Edit'nil);
            if IsWindow(AppHWnd) and IsWindow(EditHWnd) then
              SendMessage(EditHWnd, WM_SETTEXT, 0, LPARAM(PChar('Hallo Welt!' + #0)));
            Break;
          end;
    finally
      List.Free;
    end;
  end;

end;

Mit CreateProcess wird das Programm Notepad gestartet. WaitForInputIdle wartet bis Notepad seine Fenster erstellt hat und Aufnahme fähig ist. CloseHandle gibt die mit CreateProcess erzeugten Kernel-Handle wieder frei. EnumWindows listet alle TopLevel Fenster auf. Diese werden dann in der Callback Funktion EnumWindowsProc in eine Liste geschrieben. Mit GetWindowThreadProcessId wird dann überprüft, ob eins der gefundenen Fenster mit dem von uns erstellten Prozess übereinstimmt. FindWindowEx sucht dann nachdem Editorfenster und SendMessage sendet dann den Text zu diesem Fenster.

_________________
Ciao, Sprint.