AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Text aus fremden Memo auslesen

Ein Thema von Yheeky · begonnen am 16. Jul 2002 · letzter Beitrag vom 17. Jul 2002
Antwort Antwort
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

Text aus fremden Memo auslesen

  Alt 16. Jul 2002, 16:10
Hi,

mit einer Funktion bekomme ich das Handle eines fremden Fensters. Das Handle habe ich als HWND. Nun möchte ich aus einem Memo bzw. RichEdit - Feld, was sich genau in diesem Fenster befindet, den Text auslesen. Wie kann ich das machen?

Gruß Yheeky
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 16. Jul 2002, 16:19
Moin Yheeky,

ich denke mal, mit EnumChildWindows das Handle zum Memo/RE ermitteln, und dann mit SendMessage und WM_GETTEXT auslesen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 16. Jul 2002, 17:10
Wenn Du das Handle hast (wie oben angerissen), dann kannst Du auch direkt die Funktion GetText nutzen.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#4
  Alt 17. Jul 2002, 00:06
Okay, danke erstmal für die Antworten.
Wie kann ich genau mit EnumChildWindows arbeiten?
Als Parameter kommt zuerst das Handle der Form und wie geht´s dann weiter? Die anderen beiden Parameter sind mir nicht so ganz klar...

Gruß Yheeky
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#5
  Alt 17. Jul 2002, 10:17
Der erste Parameter zu EnumChildWindows() ist der Handle zum Elternfenster, das ist dir ja schon klar.
Der zweite Parameter ist eine anwendungsdefinierte Funktion bzw. deren Adresse, also eine Funktion, die du selbst definierst und die ungefähr so aussehen muss:
Code:
function EnumChildProc(hWindow: HWND, lParameter: LPARAM): Boolean; stdcall;
begin

end;
Der dritte Parameter darf von deiner Anwendung selbst definiert werden, damit deine EnumChildProc() ihn erkennt ;c) Setz' einfach 0 ein.

Diese Funktion wird jetzt für jedes Kindfenster aufgerufen, und hWindow ist dabei der Handle des Kindfensters. Der übergebene LPARAM ist der Wert, den du bei EnumChildWindows() angegeben hast.
In der Funktion kannst du also jetzt z.B. den Typ des Fensters überprüfen, und solange weitermachen, bis du das entsprechende gefunden hast.
Als Rückgabewert musst du true zurückgeben, wenn du weitermachen willst und false, wenn die Aufzählung aufhören soll (also wenn du das gefunden hast was du willst).

Alternativ kannst du auch mit FindWindowEx() das Fenster suchen, was sinnvoll ist wenn es beispielsweise nur das eine Memo gibt. FindWindowEx() übergibst du die Parameter Parenthandle, 0, 'EDIT', 0, wobei EDIT der Klassenname ist, den du gegebenenfalls anpassen musst.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#6
  Alt 17. Jul 2002, 13:11
Mhmm, okay, danke. Ich habe es mehrere Male getestet, aber ich kam nicht zum gewünschten Ergebnis. Am besten ich poste mal den Code:

Code:
function ICQGetOwnerMessage(const Msg: String): Boolean;
  function FindMessageWindow(const Start: HWND): HWND;
  var
    H: HWND;
    S: PChar;
  begin
    Result := 0;
    H := Start;
    S := StrAlloc(256);
    while H > 0 do begin
      GetWindowText(H, S, 256);
      if (Pos('Change', S) > 0)
      and (Pos('Confirm', S) > 0)
      and (Pos('Message', S) > 0) then begin
        Result := H;
        Exit;
      end;
      H := GetNextWindow(H, GW_HWNDNEXT);
    end;
    StrDispose(S);
  end;

var
  H, I: HWND;
begin
  Result := False;
  H := FindMessageWindow(GetForeGroundWindow);
  if H = 0 then
    Exit;
  SetForeGroundWindow(H);
  I := GetNextDlgTabItem(H, 0, False);
  I := GetNextDlgTabItem(H, I, False);
  if I <> 0 then begin
  // HIER MUSS DOCH DER CODE REIN, ODER???

  Result := True;
  end;
end;
Wäre gut, wenn jemand den Code ergänzen könnte. Mit meinen Varianten hat´s nur teilweise geklappt. Übrigens wird bei mir WM_GETTEXT nicht gefunden! Nur SB_GETTEXT findet Delphi.

Gruß Yheeky
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7
  Alt 17. Jul 2002, 14:25
Zitat von Yheeky:
Übrigens wird bei mir WM_GETTEXT nicht gefunden! Nur SB_GETTEXT findet Delphi.
Kann nicht sein. WM_GETTEXT ist eine Message und muß mit SendMessage gesendet werden. Wäre übrigens hier vorzuziehen, da GetWindowText prozessübergreifend nicht immer zuverlässig funktioniert.
Code:
var
  buffer: array[0..255] of char;
begin
  SendMessage(hWnd, WM_GETTEXT, sizeof(buffer), Integer(@buffer));
Dann steht in buffer der ausgelesene Text.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#8
  Alt 17. Jul 2002, 15:57
Okay, das klingt logisch - ich habe es auch probiert, aber ich bekomme einfach nicht den Text zurück:

So habe ich es eingebaut:

Code:
function ICQGetOwnerMessage: String;
  function FindMessageWindow(const Start: HWND): HWND;
  var
    H: HWND;
    S: PChar;
  begin
    Result := 0;
    H := Start;
    S := StrAlloc(256);
    while H > 0 do begin
      GetWindowText(H, S, 256);
      if (Pos('Change', S) > 0)
      and (Pos('Confirm', S) > 0)
      and (Pos('Message', S) > 0) then begin
        Result := H;
        Exit;
      end;
      H := GetNextWindow(H, GW_HWNDNEXT);
    end;
    StrDispose(S);
  end;

var
  H, I: HWND;
  buffer: array[0..200] of char;

begin
  Result := '';
  H := FindMessageWindow(GetForeGroundWindow);
  if H = 0 then
    Exit;
  SetForeGroundWindow(H);
  I := GetNextDlgTabItem(H, 0, False);
  I := GetNextDlgTabItem(H, I, False);
  if I <> 0 then begin
  SendMessage(I, WM_GETTEXT, sizeof(buffer), Integer(@buffer));
  Result := Buffer;
  end;
end;
In die SendMessage-Schleife geht er erst garnicht rein, deswegen kann das Result auch nicht richtig angezeigt werden - ist klar.
Was genau muss ich verändern?

Gruß Yheeky
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#9
  Alt 17. Jul 2002, 23:00
Das Thema hat sich gerade erledigt Die nächste Frage kommt aber gleich 8)
Trotzdem danke für die Hilfe!

Gruß Yheeky
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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