![]() |
Text aus fremden Memo auslesen
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 |
Moin Yheeky,
ich denke mal, mit EnumChildWindows das Handle zum Memo/RE ermitteln, und dann mit SendMessage und WM_GETTEXT auslesen. |
Wenn Du das Handle hast (wie oben angerissen), dann kannst Du auch direkt die Funktion GetText nutzen.
|
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 |
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:
Der dritte Parameter darf von deiner Anwendung selbst definiert werden, damit deine EnumChildProc() ihn erkennt ;c) Setz' einfach 0 ein.
function EnumChildProc(hWindow: HWND, lParameter: LPARAM): Boolean; stdcall;
begin end; 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. |
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:
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.
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; Gruß Yheeky |
Zitat:
Code:
Dann steht in buffer der ausgelesene Text.
var
buffer: array[0..255] of char; begin SendMessage(hWnd, WM_GETTEXT, sizeof(buffer), Integer(@buffer)); |
Okay, das klingt logisch - ich habe es auch probiert, aber ich bekomme einfach nicht den Text zurück:
So habe ich es eingebaut:
Code:
In die SendMessage-Schleife geht er erst garnicht rein, deswegen kann das Result auch nicht richtig angezeigt werden - ist klar.
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; Was genau muss ich verändern? Gruß Yheeky |
Das Thema hat sich gerade erledigt :) Die nächste Frage kommt aber gleich 8)
Trotzdem danke für die Hilfe! Gruß Yheeky |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 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