Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Memo in anderem Programm auslesen (https://www.delphipraxis.net/71680-memo-anderem-programm-auslesen.html)

Mirco 19. Jun 2006 13:55


Memo in anderem Programm auslesen
 
Hallo :-D
wie kann ich ein Memo in einem anderem Programm auslesen.
Das HAndle verändert sich ja immer wenn das Programm neu startet.
Viele Grüsse
Mirco

droppi 19. Jun 2006 14:24

Re: Memo in anderem Programm auslesen
 
Also wegen dem mit dem Handle würd ich mir mal Findwindow() angucken. Wegen dem Memo auslesen müsstest du irgendwas mit Messages machen.

Mirco 19. Jun 2006 14:50

Re: Memo in anderem Programm auslesen
 
Hallo
Ich hab mal beim Internet Explorer folgendes gemacht um mich automatisch bei einem HTAcess Fenster einzuloggen:
Der Quelltext ist nicht von mir.
Delphi-Quellcode:
function TForm1.feld: boolean;
var
  ShellWindow: IShellWindows;
  WB: IWebbrowser2;
  spDisp: IDispatch;
  IDoc1: IHTMLDocument2;
  Document: Variant;
  k, m: Integer;
  ovElements: OleVariant;
  i: Integer;
begin
  result := false; //assume no go

  ShellWindow := CoShellWindows.Create;
  // get the running instance of Internet Explorer
  for k := 0 to ShellWindow.Count do
  begin
    spDisp := ShellWindow.Item(k);
    if spDisp = nil then Continue;
    // QueryInterface determines if an interface can be used with an object
    spDisp.QueryInterface(iWebBrowser2, WB);
    if WB <> nil then
    begin try

        WB.Document.QueryInterface(IHTMLDocument2, iDoc1);
      except
      end;
      if iDoc1 <> nil then
      begin
        WB := ShellWindow.Item(k) as IWebbrowser2;
        begin
          Document := WB.Document;
          // count forms on document and iterate through its forms
          for m := 0 to Document.forms.Length - 1 do
          begin
            ovElements := Document.forms.Item(m).elements;
            // iterate through elements
            for i := 0 to ovElements.Length - 1 do
            begin
              // when input fieldname is found, try to fill out
              try
                if (CompareText(ovElements.item(i).tagName, 'INPUT') = 0) and
                  (CompareText(ovElements.item(i).type, 'text') = 0) then
                begin
                  ovElements.item(i).Value := 'username';
                end;
              except
              end;
                try
                if (CompareText(ovElements.item(i).tagName, 'INPUT') = 0) and
                  (CompareText(ovElements.item(i).type, 'SUBMIT') = 0) and
                  (ovElements.item(i).Value = 'weiter') then // Suchen für German
                begin
                  ovElements.item(i).Click;
                  result := true; // we're a go!

                end;
              except
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;
Die Anordnung meines Fensters in der anderen Anwendung sieht so aus:
Delphi-Quellcode:
786638: TDataForm "Data"
  786640: TPanel "Panel1"
    721098: TPanel
      983250: TMemo "TExt"
Ich bekomm den Quelltext oben nicht angepasst.
Grüsse
Mirco

Mirco 20. Jun 2006 11:40

Re: Memo in anderem Programm auslesen
 
Ist das sehr kompliziert?

Viele Grüsse
Mirco

Luckie 20. Jun 2006 14:11

Re: Memo in anderem Programm auslesen
 
Der IE hat überhauptnichts mit anderen Windows Anwendungen zu tun.

Stichworte für die Forensuche: Hier im Forum suchenFindWindow, Hier im Forum suchenFindWindowEx, Hier im Forum suchenEnumWindows, Hier im Forum suchenEnumChildWindows, Hier im Forum suchenWM_SETTEXT, Hier im Forum suchenWM_GETTEXT, Hier im Forum suchenWM_GETTEXTLENGTH.

Mirco 21. Jun 2006 11:32

Re: Memo in anderem Programm auslesen
 
Danke Luckie,
ich schau mir das alles mal an.
Viele Grüsse Mirco

Mirco 21. Jun 2006 12:28

Re: Memo in anderem Programm auslesen
 
Hallo,
ich habe folgendes Beispiel gefunden.
Das klappt zum Beispiel ganz gut mit Notepad, aber nicht mit meinem Programm.
Das Memo was ich auslesen will liegt in dem Programm auf einer zweiten Form.
Kann es sein das es deswegen nicht funktioniert?


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  function EnumWindowsProc(Wnd: HWND; lParam: LPARAM): BOOL; stdcall;
  var
    ClassName: string;
    EditHWnd: HWND;
  begin
    SetLength(ClassName, 512);
    SetLength(ClassName, GetClassName(Wnd, PChar(ClassName), Length(ClassName)));
    if ClassName = 'Notepad' then
    begin
      EditHWnd := FindWindowEx(Wnd, 0, 'Edit', nil);
      if IsWindow(EditHWnd) then
        TList(lParam).Add(Pointer(EditHWnd));
    end;
  end;

var
  List: TList;
  I: Integer;
  S: string;
begin

  List := TList.Create;
  try
    EnumWindows(@EnumWindowsProc, LPARAM(List));
    for I := 0 to List.Count - 1 do
    begin
      SetLength(S, SendMessage(HWND(List.Items[I]), WM_GETTEXTLENGTH, 0, 0) + 1);
      if Length(S) > 1 then
      begin

        SetLength(S, SendMessage(HWND(List.Items[I]), WM_GETTEXT, Length(S), LPARAM(PChar(S))));
        Showmessage(S);
       // S := StringReplace(S, '111', 'Neuer Text', [rfReplaceAll]);
       // SendMessage(HWND(List.Items[I]), WM_SETTEXT, Length(S), LPARAM(PChar(S)));
      end;
    end;
  finally
    List.Free;
  end;
end;
Kann mir das bitte mal jemand erklären?
Viele Grüsse
Mirco

Mirco 22. Jun 2006 17:24

Re: Memo in anderem Programm auslesen
 
*PUSH*
soooo...nun darf ich aber mal :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz