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 gelöst Text aus Fenster einen andren Anwendugn auslegen (https://www.delphipraxis.net/94562-geloest-text-aus-fenster-einen-andren-anwendugn-auslegen.html)

Dumpfbacke 23. Jun 2007 11:41


gelöst Text aus Fenster einen andren Anwendugn auslegen
 
Hallo Leute,
ich wollte von meinem Program aus ein Fenster (Dialogbox) auslesen. Der Text im Fenster ist ab einer bestimmten stelle nicht mehr gleich. Es steht dort immer die ID des Datensatzes drin welche ich gene hätte.

Dazu habe ich erst mal versucht das Fenster zu finden

Code:
wnd := Findwindow('#32770', 'Test - gut');
wnd := FindWindowEx(wnd, 0, 'Edit', 'Datzsatz ID : 32768');
Das Fentser wurde gefunden und sogar das "innere" mit dem Text.
Leider ändert sich ja immer die ID und diese möchte ich ja auslesen. Dazu habe ich dieses versucht.

Code:
var
wnd: HWND;
WindowText: array[0..255] of char


wnd := Findwindow('#32770', 'Test - gut');
wnd := FindWindowEx(wnd, 0, 'Edit', nil);
GetWindowsText (wnd, WindowText, 255)
Leider ist kein Text in Windowtext. Die zweite wnd sollte ja beim Fall 1 und 2 immer gleich sein. Das ist nicht so. Aus diesem Grund bekomm ich villeicht keinen Text.

Kann mir jemand hier weiterhelfen

:wall:

Cu Tanja.

bitsetter 23. Jun 2007 12:33

Re: Text aus Fenster einen andren Anwendugn auslegen
 
Hallo,

kann es sein, dass es in dem Fenster mehrere Felder gibt? Dann könnte es sein, dass das falsche Fenster ausgelesen wird.
Eventuell könntest du es mal mit MSDN-Library durchsuchenEnumChildWindows versuchen:
Delphi-Quellcode:
function EnumChildProc(wnd: HWND; Lines: TStrings): BOOL; stdcall;
var
  WindowText: array[0..255] of char;
begin
  Result := True;
  windows.GetWindowText(wnd, WindowText, 255);
  Lines.Add(WindowText);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  wnd: HWND;
begin
  wnd := Findwindow('#32770', 'Test - gut');
  if wnd > 0 then
    EnumChildWindows(wnd, @EnumChildProc, Integer(memo1.Lines));
end;

Christian Seehase 23. Jun 2007 12:47

Re: Text aus Fenster einen andren Anwendugn auslegen
 
Moin Tanja,

was passiert, wenn Du das hier

Delphi-Quellcode:
var
  hMain : DWORD;
  hSub : DWORD;
  iLen : integer;
  pText : PChar;

begin
  hMain := FindWindow('#32770','Test - gut');
  if hMain = 0 then begin
    ShowMessage('Meldung nicht gefunden'#13#10+
                 SysErrorMessage(GetLastError));
    Exit;
  end;
  hSub := FindWindowEx(hMain,0,'EDIT',nil);
  if hMain = 0 then begin
    ShowMessage('Inhalt nicht gefunden'#13#10+
                 SysErrorMessage(GetLastError));
    Exit;
  end;
  iLen := SendMessage(hSub,WM_GETTEXTLENGTH,0,0)+1;
  if iLen = 0 then begin
    ShowMessage('Kein Inhalt');
    Exit;
  end;
  pText := AllocMem(iLen);
  try
    if SendMessage(hSub,WM_GETTEXT,wParam(iLen),lParam(pText)) = 0 then begin
      ShowMessage('0 Zeichen kopiert');
    end else begin
      ShowMessage(pText);
    end;
  finally
    FreeMem(pText,iLen);
  end;
end;
verwendest?

Dumpfbacke 24. Jun 2007 10:35

Re: Text aus Fenster einen andren Anwendugn auslegen
 
Zitat:

Zitat von Christian Seehase
Moin Tanja,

was passiert, wenn Du das hier


verwendest?

Danke Christian es geht super mit dem Code.

Tanja

michback 3. Jun 2009 14:51

Re: gelöst Text aus Fenster einen andren Anwendugn auslegen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  hMain : DWORD;
  hSub : DWORD;
  iLen : integer;
  pText : PChar;

begin
  hMain := FindWindow(NIL,'meineeiner');
  if hMain = 0 then begin
    ShowMessage('Meldung nicht gefunden'#13#10+
                 SysErrorMessage(GetLastError));
    Exit;
  end;
  hSub := FindWindowEx(hMain,0,'EDIT',nil);
  if hMain = 0 then begin
    ShowMessage('Inhalt nicht gefunden'#13#10+
                 SysErrorMessage(GetLastError));
    Exit;
  end;
  iLen := SendMessage(hSub,WM_GETTEXTLENGTH,0,0)+1;
  if iLen = 0 then begin
    ShowMessage('Kein Inhalt');
    Exit;
  end;
  pText := AllocMem(iLen);
  try
    if SendMessage(hSub,WM_GETTEXT,wParam(iLen),lParam(pText)) = 0 then begin
      ShowMessage('0 Zeichen kopiert');
    end else begin
      ShowMessage(pText);
    end;
  finally
    FreeMem(pText,iLen);
  end;
end;
Dies Funktioniert mit normnalen Programmen super. Leider habe ich ein Zeichen Problem. Das Fester was ich auslesen will heist:


'meineeiner'successfully saved"


Die Striche kann ich ja bei der Fensterbezeichnung nicht eingeben da streik delphi. Muss ich das über ASCII Codes eledigen. Weil so hat es bei mir nicht funktioniert.

Delphi-Quellcode:
hMain := FindWindow(NIL,chr(039)+'meineeiner'+chr(039)+' successfully saved'+chr(034));

Apollonius 3. Jun 2009 15:01

Re: gelöst Text aus Fenster einen andren Anwendugn auslegen
 
Dein Problem hat absolut nichts mit dem ursprünglichen Threadinhalt zu tun! Hochkommata in Strings musst du in Delphi verdoppeln, also beispielsweise '''' für ein einfaches Hochkomma. Übrigens ist "hat nicht funktioniert" keine Fehlermeldung.

michback 3. Jun 2009 15:04

Re: gelöst Text aus Fenster einen andren Anwendugn auslegen
 
Zitat:

Zitat von Apollonius
Dein Problem hat absolut nichts mit dem ursprünglichen Threadinhalt zu tun! Hochkommata in Strings musst du in Delphi verdoppeln, also beispielsweise '''' für ein einfaches Hochkomma. Übrigens ist "hat nicht funktioniert" keine Fehlermeldung.


Danke für die Hilfe. Es bezog sich auf die oben genante Lösung. Und hat nich funktioniert meint Das Fenster wurde nicht gefunden.


Gelöst: Das Fenster wurde gefunden wie oben im meinen Post geschrieben. Es ligt daran das die Zeichen nich ausgelesen werden können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 Uhr.

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