![]() |
Senden Von Strings an andere Programme
Hallo, ich habe mal eine Weile gesucht aber nichts wirklich passendes gefunden.
Wie kann man den String eines RichEdits oder Memo an ein anderes Programm senden/empfangen? Um das Ganze ein wenig genauer zu beschreiben: ich habe ein kleines Programm geschrieben, mit dessen Hilfe man Texte in leichter Form kodieren kann(einfach mit Ascii Verschiebung). Und nun würde ich diesen kodierten/dekodierten Text gerne direkt an Icq senden und abschicken lassen. Und wenn eine Antwort bei Icq kommt, diese direkt wieder in mein Programm laden lassen. Das würde das lästige Kopieren/Einfügen ersparen. |
Re: Senden Von Strings an andere Programme
Gewünschtes Fenster Suchen mit FindWindow und dann mit WM_GETTEXT und WM_SETTEXT (hoffentlich richtiger Name) Text auslesen und schreiben. Beispiele sollten sich per Forensuche viele finden lassen.
|
Re: Senden Von Strings an andere Programme
so, habe jetzt mal ein bisschen rumgetüfftelt und nachgeschaut, aber ich komme damit irgendwie nicht zurecht.
Wie sehen diese Funktionen denn an konkreten Beispielen aus? denn wenn ich versuche die bestimmten Parameter einzugeben, treffe ich immer nur auf neue Fehlermeldungen oder es passiert gar nichts. |
Re: Senden Von Strings an andere Programme
Moin Maddin,
da hier im Forum eingentlich reichlich funktionierende Beispiele zu finden sind, wäre es in diesem Falle wohl das einfachste, wenn Du mal zeigst, wie Du es versucht hast. |
Re: Senden Von Strings an andere Programme
naja wüsste ich jetzt selbst gern^^
--->nich gespeichert hat. ich versuche es einfach noch einmal und wenn es nicht klappt gibts hier den quelltext. |
Re: Senden Von Strings an andere Programme
also, ich habe das jetzt wieder gefunden, hier im Forum:
Delphi-Quellcode:
So... das Ganze läuft in einer Schleife, damit es sich ständig aktualisiert.
procedure TForm1.FormCreate(Sender: TObject);
var h: HWND; text,classname:String; var i : integer; begin for i:=0 to 20 do begin gettickcount; begin h:=FindWindow(nil,'Name des Chatteilnehmers'); //h:=GetForegroundWindow; SetLength(text,SendMessage(h,WM_GETTEXTLENGTH,0,0)+1); SendMessage(h,WM_GETTEXT,length(text),Integer(@text[1])); SetLength(ClassName, 255); //get the class name and reset the //memory area to the size of the name SetLength(ClassName, GetClassName(h, PChar(className), Length(className))); memo1.Text:=classname; memo2.Text:=text; end; end; end; Ich komme zwar nun an den Klassennamen heran (der bei Icq immer gleich ist), aber ich weiß nicht, wie ich auf das Eingabefeld in diesem Chatfenster zugreifen kann. Außerdem, ist der Titel des Fensters, der Name des anderen Users, was sich ja auch ständig ändert, also kann man das ja auch nicht oben einfach so ohne variable bei h:=findwindow festlegen. |
Re: Senden Von Strings an andere Programme
Zitat:
wenn der Klassennamen von Icq eindeutig ist, kannst du ja das ganze mal umdrehen:
Delphi-Quellcode:
h:= FindWindow('IcqClassName...',nil);
Zitat:
![]() ![]() |
Re: Senden Von Strings an andere Programme
Mit WinSpy habe ich mir den Klassennamen ja anzeigen lassen.
Aber wo ich nicht ganz durchgesehen habe, da wurden noch andere Sachen mit aufgelistet. Ich weiß nicht, ob es verschiedene Komponenten da, auf jeden fall, steht da ja auch nix von wegen Edit oder irgendwas, was auf ein eingabefeld hindeuten würde, deswegen bin ich mir auch nicht ganz sicher wegen dem generierten Code von WinSpy. aber trotzdem schonmal dankeschön, ich werde nochmal ein wenig was ausprobieren. |
Re: Senden Von Strings an andere Programme
also bei findwindow habe ich jetzt mit dem Klassennamen abgefragt und probiert was zu schicken mit
Delphi-Quellcode:
aber winspy zeigt mir an, das der titel jetzt nur in mein memo text umgeändert wurde.
SendMessage(wnd, WM_SETTEXT, 0, Integer(Pchar(memo2.Text)));
Sehen tut man das nicht, halt nur bei winspy. Aber von den koordinaten her, ist es schon das richtige fenster. |
Re: Senden Von Strings an andere Programme
an welchen handle hast du das geschickt ? an den normalen ICQ handle oder an den textfeld handle vom icq ?
weil du müsstest es an den Handle vom "textfeld" das ganze schicken... kannst mit WinSpy das gewünschte "textfeld" (ich weis halt nicht was es ist beim ICQ) anwählen/markieren und dann oben auf Code klicken und es erstellt dir einen Möglichen Code ( meist nicht optimal aber auch nicht grundübel) womit du an den gewünschten handle kommst. LG Severin |
Re: Senden Von Strings an andere Programme
nunja, habe das Fenster markiert und es gibt 4 Einträge, mit jeweils handle, classname und titel.
Ich habe einen Eintrag genommen, dessen Koordinaten mit denen des Eingabefeldes entspricht. Wobei dieser Eintrag auch nen untergordneten Eintrag enthält: einmal mit classname und einmal als Internetexplorer. Ich habe es mit beiden Varianten versucht, doch jedes mal hat er nur den Titel geändert, wovon man das aber auch nur bei Winspy sehen kann. -->man is das alles kompliziert^^ Also das Eingabefeld kann man auch nicht extra markieren, sondern nur das gesamte Chatfenster, und man könnte dann den gewünschten Eintrag wählen, wie oben bereits erwähnt. |
Re: Senden Von Strings an andere Programme
Delphi-Quellcode:
jetzt noch mixen mit GetText und natürlich mit Deinem Text.
procedure SendText;
var Text: String; EditHandle, WindowHandle: HWND; begin Text := 'Hallo'; WindowHandle := FindWindow(nil, 'XXX - Nachrichtensitzung'); EditHandle := FindWindowEx(WindowHandle, 0, 'RichEdit20A', nil); SendMessage(EditHandle, WM_SETTEXT, 0, Integer(PChar(Text))); end; Andreas |
Re: Senden Von Strings an andere Programme
hey danke Andreas, aber leider funzt das auch nicht,
Delphi-Quellcode:
Diese Abfrage habe ich ja im Prinzip schon als Schleife, nur dass ich nach den Klassennamen abfrage und nicht nach den Titel(da der ja Variabel ist).
WindowHandle := FindWindow(nil, 'XXX - Nachrichtensitzung');
Mein Problem scheint ja eigentlich nur darin zu liegen, dass ich nicht weiß, wie ich auf die Komponente zugreifen kann. Habe das ganze gestern mal dem einfachen Standart Editor von Windows probiert und es hat super gefunzt. Da heißt das RichEdit bei WinSpy auch einfach: Edit. Bei Icq gibt es leider keine derartige bezeichnung, und ich weiß nicht welches Handle ich nun benötige um Gettext/Settext zu verwenden. |
Re: Senden Von Strings an andere Programme
hmm? Mit meiner icq version funktioniert das Prima. XXX ersetzt Du mit dem Namen des Chatters.
Mit WinSpy konnte ich in 30 Sekunden die Klasse des Texteingabefelds ermitteln: RichEdit20A Im Prinzip musst Du so nur noch das übergeordnete Fenster finden. Wo genau ist das Problem?? |
Re: Senden Von Strings an andere Programme
RichEdit20A steht irgendwie nirgends bei WinSpy.
Ich habe halt, wie gesagt ein Fenster gefunden was von den Koordinaten mit dem Eingabe Feld übereinstimmt, aber wenn ich dessen Handle nehme passiert halt nichts... |
Re: Senden Von Strings an andere Programme
welche Icq Version hast du denn? ich hab 6
|
Re: Senden Von Strings an andere Programme
also hab das jetzt mal folgender maßen:
Delphi-Quellcode:
Der Scheint aber RichEdit20A nicht zu kennen, weil als ich mir dann windowhandle mal ausgegeben lassen habe kam ein wert raus, doch ab EditHandle, sprich also bei RichEdit20A kam 0 raus
procedure TForm1.Button1Click(Sender: TObject);
var EditHandle, WindowHandle: HWND; begin windowhandle:= FindWindow('__oxFrame.class__',nil); windowhandle:= FindWindowEx(windowhandle, 0, '__oxFrame.class__', nil); windowhandle := FindWindowEx(windowhandle, 0, 'Internet Explorer_Server', nil); EditHandle := FindWindowEx(WindowHandle, 0, 'RichEdit20A', nil); SendMessage(edithandle, WM_SETTEXT, 0, Integer(PChar(memo2.Text))); memo1.Text:=inttostr(windowhandle) end; |
Re: Senden Von Strings an andere Programme
Hallo
So etwas sollte man nicht im "FormCreate" tun, denn hier wir das formular mit seinen Kindern noch aufgebaut ... (Beisopiel weiter oben ...) |
Re: Senden Von Strings an andere Programme
Zitat:
Zitat:
|
Re: Senden Von Strings an andere Programme
hmmm und wie kann man da nun rangehen?
|
Re: Senden Von Strings an andere Programme
Zitat:
Hallo, mein ICQ (V.6) hat gar kein RichEdit20A als Chat Control... Welche Version hast du denn? ![]() |
Re: Senden Von Strings an andere Programme
ja genau, hab auch 6, gibts bei mir auch nicht
und über Internet Explorer_Server kann man nur den Titel verändern, was man aber auch nur in WinSpy sehen kann |
Re: Senden Von Strings an andere Programme
Zitat:
wie du möchtest. Habe das Auslesen des ICQ Textes bei mir getestst und ese funktioniert:
Delphi-Quellcode:
uses
ActiveX, MSHTML, SHDocVw; // Hilfsfunktion zum finden von Childfenstern function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND; var i: Word; hChild: HWND; begin hChild := 0; Result := 0; ChildNr := ChildNr - 1; for i := 0 to ChildNr do begin hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil); if hChild = 0 then Exit; Result := hChild; end; end; type TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall; // IHTMLDocument2 vom Handle Internet Explorer_Server ermitteln function GetHTMLDocumentFromHWND(wnd: HWND): IHTMLDocument2; var hInst: HWND; lRes: Cardinal; MSG: Integer; ObjectFromLresult: TObjectFromLresult; pDoc: IHTMLDocument2; begin Result := nil; hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult'); if @ObjectFromLresult <> nil then begin try MSG := RegisterWindowMessage('WM_HTML_GETOBJECT'); SendMessageTimeOut(wnd, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes); if ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc) = S_OK then Result := pDoc; finally FreeLibrary(hInst); end; end; end; function GetICQChatDoc(DisplayName: string): IHTMLDocument2; var wndICQChat, wnd: HWND; htmlDoc: IHTMLDocument2; Params: OleVariant; begin Result := nil; // ICQ Chatfenster suchen if DisplayName = '' then wndICQChat := FindWindow('__oxFrame.class__', nil) else wndICQChat := FindWindow('__oxFrame.class__', PChar(DisplayName)); if wndICQChat <> 0 then begin wnd := FindWindowEx2(wndICQChat, '__oxFrame.class__', 2); if wnd <> 0 then begin // Internet Explorer_Server vom Chatfenster suchen wnd := FindWindowEx(wnd, 0, 'Internet Explorer_Server', nil); if wnd <> 0 then begin // htmlDoc vom Handle ermitteln htmlDoc := GetHTMLDocumentFromHWnd(wnd); // body.innerText zurückgeben if htmlDoc <> nil then Result := htmlDoc //htmlDoc.body.innerText; end; end; end; end; function GetICQChatText(DisplayName: string): string; var ICQhtmlDoc: IHTMLDocument2; begin ICQhtmlDoc := GetICQChatDoc(''); if ICQhtmlDoc <> nil then Result := ICQhtmlDoc.body.innerText; end; procedure TForm1.FormCreate(Sender: TObject); begin Showmessage(GetICQChatText('')); // hier kannst du ICQ Anzeigenamen übergeben end; |
Re: Senden Von Strings an andere Programme
hmm bei mir zeigt der an, dass er keine MSHTML.dcu und SHDocVw.dcu finden kann.
aber trotzdem schonmal dankeschön, ich werd mich mal nach den dateien umsehen. |
Re: Senden Von Strings an andere Programme
Hi,
welche Delphi Version hast du, kann auch MSHTML oder SHDocVw sein, ich hatte nämlich auch gerade mit der Funktion GetIEFromHWND() experimentiert, aber Toms war schneller. Edit: Ich meinte natürlich Shdocvw_tlb und MSHTML_TLB; |
Re: Senden Von Strings an andere Programme
ich habe die abgespeckte, kostenlose Variante von Delphi 2005
|
Re: Senden Von Strings an andere Programme
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Senden Von Strings an andere Programme
hmmm also habe das jetzt mal alles so gemacht, aber wenn ich die Funktion GetICQChatText('') aufrufe, wird meine Memo oder Message einfach nur leer.
|
Re: Senden Von Strings an andere Programme
Zitat:
Nachtrag: Das ICQ Hauptfenster hat den gleichen Klassennamen wie das Chatfenster. Darum findet es unter Umständen das falsche Fenster. |
Re: Senden Von Strings an andere Programme
Wie ich rauslesen konnte willst du eigentlich nur einen text an ein ICQ-fenster schicken, richtig?
Da hab ich mir erst gestern was gemacht, hier:
Delphi-Quellcode:
procedure SendText(AText: String);
var lCount : Integer; h : HWND; begin h := FindWindow('IcqClass...', nil); h := FindWindowEx(h, 0, 'Class2', nil); // Hier die class vom memo im ICQ chat fenster. for lCount := 1 To Length(AText) Do begin PostMessageA(h, WM_Char, ord(AText[lCount]), 0); end; end; |
Re: Senden Von Strings an andere Programme
ja also habe mir das jetzt mal in 4 labels ausgeben lassen und es kommt immer nichts raus...
könnte man das Icq Hauptfenster während der Laufzeit nicht irgendwie umbenennen oder markieren sodass es sich vom Chatfenster unterscheidet? dankeschön k4ni, aber funzt irgendwie nicht^^ |
Re: Senden Von Strings an andere Programme
Zitat:
Zitat:
Delphi-Quellcode:
uses
ActiveX, MSHTML, SHDocVw; // Hilfsfunktion zum finden von Childfenstern function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND; var i: Word; hChild: HWND; begin hChild := 0; Result := 0; ChildNr := ChildNr - 1; for i := 0 to ChildNr do begin hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil); if hChild = 0 then Exit; Result := hChild; end; end; type TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall; // IHTMLDocument2 vom Handle Internet Explorer_Server ermitteln function GetHTMLDocumentFromHWND(wnd: HWND): IHTMLDocument2; var hInst: HWND; lRes: Cardinal; MSG: Integer; ObjectFromLresult: TObjectFromLresult; pDoc: IHTMLDocument2; begin Result := nil; hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult'); if @ObjectFromLresult <> nil then begin try MSG := RegisterWindowMessage('WM_HTML_GETOBJECT'); SendMessageTimeOut(wnd, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes); if ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc) = S_OK then Result := pDoc; finally FreeLibrary(hInst); end; end; end; // Das Handle vom ICQ Chat Control ermitteln function GetICQChatHandle(wndICQChat: HWND; DisplayName: string): HWND; const ICQ_WIN_CLASS = '__oxFrame.class__'; ICQ_MainWIN_Caption = 'ICQ'; var wnd: HWND; htmlDoc: IHTMLDocument2; Params: OleVariant; ClassName, captionName: string; begin Result := 0; SetLength(className, 20); SetLength(className, GetClassName(wndICQChat, PChar(className), length(ICQ_WIN_CLASS) + 1)); SetLength(captionName, 20); SetLength(captionName, GetWindowText(wndICQChat, PChar(captionName), 256)); if (className = ICQ_WIN_CLASS) then // Falls ICQ Fenster Klasse übereinstimmt if (captionName <> 'ICQ') then // aber nicht das Hauptfenster // Falls ein Displayname angegeben ist muss er übereinstimmen if (DisplayName = '') or (DisplayName = captionName) then begin wnd := FindWindowEx2(wndICQChat, ICQ_WIN_CLASS, 2); if wnd <> 0 then begin // Internet Explorer_Server vom Chatfenster suchen Result := FindWindowEx(wnd, 0, 'Internet Explorer_Server', nil); end; end; end; type PEnumInfo = ^TEnumInfo; TEnumInfo = record wndICQChat: HWND; DisplayName: string; end; function EnumWindowsProc(wnd: HWND; var EnumInfo: TEnumInfo): Bool; stdcall; export; var ClassName: array[0..255] of char; wndICQChat: HWND; begin Result := True; wndICQChat := GetICQChatHandle(wnd, EnumInfo.DisplayName); // ICQ Chat Handle ermitteln if wndICQChat <> 0 then begin // gefunden. EnumWindows abbrechen Result := False; EnumInfo.wndICQChat := wndICQChat; end; end; // IHTMLDocument2 vom ICQ Chat Control ermitteln function GetICQChatDoc(DisplayName: string): IHTMLDocument2; var wndICQChat: HWND; htmlDoc: IHTMLDocument2; EnumInfo: TEnumInfo; begin EnumInfo.DisplayName := DisplayName; // alle Fenster durchlaufen EnumWindows(@EnumWindowsProc, Integer(@EnumInfo)); wndICQChat := EnumInfo.wndICQChat; if wndICQChat <> 0 then begin // htmlDoc vom Handle ermitteln htmlDoc := GetHTMLDocumentFromHWnd(wndICQChat); // body.innerText zurückgeben if htmlDoc <> nil then Result := htmlDoc; end; end; // den Text vom ICQ Chat Control ermitteln function GetICQChatText(DisplayName: string): string; var ICQhtmlDoc: IHTMLDocument2; begin ICQhtmlDoc := GetICQChatDoc(DisplayName); if ICQhtmlDoc <> nil then Result := ICQhtmlDoc.body.innerText; end; // Test: Text vom ICQ Chat Control ermitteln procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(GetICQChatText('')); // hier kannst du ICQ Anzeigenamen übergeben end; |
Re: Senden Von Strings an andere Programme
der bricht jetzt, wenn ich die Funktion GetICQChatText ausführe ab und zeigt irgendwas mit EStack Overflow aufgetreten an.
|
Re: Senden Von Strings an andere Programme
Zitat:
|
Re: Senden Von Strings an andere Programme
weiß nicht genau wo, da er auch keinen Fehlerpunkt markiert, aber es müsste in der Enum Funktion sein.
|
Re: Senden Von Strings an andere Programme
Zitat:
|
Re: Senden Von Strings an andere Programme
öhm löl sorry, wenn ich jetz hier nen bisschen doof sein sollte aber, wie denn?^^
also irgendwie hat der mir grad hier, als ich nen haltepunkt gesetzt habe wndICQChat := GetICQChatHandle(wnd, EnumInfo.DisplayName); anders makiert^^ hoffe das hilft *g* |
Re: Senden Von Strings an andere Programme
Zitat:
![]() |
Re: Senden Von Strings an andere Programme
also wenn ich es auf Gesamte Routine starten will, zeigt der mir ein Fehler in der Projekt Datei bei begin an.
Bei Einzelne Anweisungen macht er mir erst einen Fehler in der SHDocVw.pas am letzten end(also end.) Danach in der anderen Unit MSHTML und danach in meiner Unit... |
Re: Senden Von Strings an andere Programme
Ich hab icq2003, da geht das perfekt.
Wenn Du eh nur ein Chatprogramm als Interface benutzt, spielt es keine Rolle welche Version es ist. Nimm einfach die alte version und Dein Problem hat sich sofort gelöst :-) Sorry war das WE nicht am PC. Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 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