![]() |
anderes program auslesen
hi.. hab mal ne frage..
ist es möglich den inhalt von einer messagebox von anderen programmen in ein memo anzuzeigen.. ich wollte eigendlich den inhalt von einem MSN Chatfenster in ein Memo anzeigen ^^. hab im internet leider nix gefunden... kann aber auch an meiner suchweise liegen :D.. ich hoffe ihr könnt mir helfen und bedanke mich jetzt schon. |
Re: anderes program auslesen
Dies ist durchaus möglich. Muss aber nicht sein.
Zuerst solltest du mal mit Winspector (oder spy++) dir die "Zusammensetzung" deines Chat-Fensters ansehen. Es könnte sich letztenendes um den Befehl LVM_GetItemText oder ähnliches handeln. |
Re: anderes program auslesen
Wenn es nur eine MessageBox ist:
Delphi-Quellcode:
function GetMessageBoxTextByCaption(const Caption: String): String;
const ID_STATIC = $0000FFFF; var hMsgBox: THandle; len: Integer; Buffer: PChar; begin hMsgBox := FindWindow(nil, PChar(Caption)); if hMsgBox <> 0 then begin len := SendMessage(GetDlgItem(hMsgBox, ID_STATIC), WM_GETTEXTLENGTH, 0, 0); if len > 0 then begin GetMem(Buffer, len + 1); try GetDlgItemText(hMsgBox, ID_STATIC, Buffer, len + 1); SetString(Result, Buffer, len + 1); finally FreeMem(Buffer); end; end; end; end; |
Re: anderes program auslesen
wie kann ich nun das konkret auslesen? also es ist wies aussieht ja keine einfache listbox.
Winspector meint es ist: DirectUIHWND (also der classname) und es liegt noch in dem andern fenster drinnen, falls das was ausmachane sollte. handle des äußeren fensters kann ich auch bekommen das ist nicht das prob. mfg |
Re: anderes program auslesen
Wenn du das Handle des äußeren Fensters hast, wieso nimmst du nicht findWindowex, um das gesuchte Fenster zu finden? Dann brauchst du nur noch ein WM_GETTEXT zu schicken und du bist fertig.
|
Re: anderes program auslesen
hey,
hab mich mit dem thema auch schon des öfteren rumgeschlagen, aber irgendwie bin ich nie durchgestiegen wie ich jetzt wirklich anhand des handles des hauptfensters, inhalte von komponenten des fensters auslesen kann. gibt es da vielleicht ein anschauliches tutorial? MfG - Ghost007 |
Re: anderes program auslesen
so ich hab mal nach dem rat von Apollonius folgendes erstellt:
Delphi-Quellcode:
das wird per timer aufgerufen und dann sieht man immer das aktuelle fenster. (da ich genau das ja auchnur später brauch)
var h: HWND;
text,classname:String; begin 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))); edit1.Text:=classname; edit2.Text:=text; h := FindWindowEx(h, 0, 'DirectUIHWND', nil); 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))); edit3.Text:=classname; edit4.Text:=text; memo1.Text:=text; end; aber beim DirectUIHWND gibt es keine ausgabe bei text. nix zu sehen.. kann man noch anders den inhalt ermitteln? mfg p.s.: also mit dem notepad und dann dort drinn editor(also anstatt directuihwnd) klappt das. da bekommt man eine ausgabe. |
Re: anderes program auslesen
der code is genial ^^, vorallem ich versteh nen sogar :) danke
Bei deinem problem kann ich dir leider nich weiterhelfen MfG - Ghost007 P.S.: guade nacht ;) |
Re: anderes program auslesen
Wird das Fenster denn gefunden?
|
Re: anderes program auslesen
gutn morgen.
jo fenster wird gefunden. also handle ist beidemale <> 0 (wenn ich msn aktiv habe) mfg EDIT: mir kam die idee, dass vllt ja auch einfach mehrere der selben komponente drinnen sind. vllt ist ja die die ich dann grad bekomme leer. wie kann ich eine schleife baun die alle inneren komponenten (alle oder einer art) durchgeht? (also z.b. ne fensterschleife ging ja mit h := getnextwindow(h, GW_HWNDNEXT); ) EDIT2: ich hab mal probiert ein listview meines andern eigenen programmes auszulesen. bekomme ich auch nicht hin. gibt es nicht noch nen andern befehl? statt WM_GETTEXT wäre sowas gut WM_GETRAWDATAB*g* |
Re: anderes program auslesen
Zitat:
|
Re: anderes program auslesen
Zitat:
MfG - Ghost007 |
Re: anderes program auslesen
Für mehrere gleiche muss man sich halt EnumWindows bzw. EnumChildWindows anschauen, damit bekommt man alle Fenster (Controls sind auch Fenster) innerhalb von anderen Fensterna aufgelistet.
|
Re: anderes program auslesen
Hier ist der Code um
1. alle Windowhandles im Process des Media-Players in Listbox aufzulisten (ListFensterButton) 2. Inhalt der in der Listbox ausgewählten sysListView anzuzeigen (GetListViewButton)
Delphi-Quellcode:
Damit kann man z.B. die Playlist auslesen.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, commctrl; type TForm1 = class(TForm) ListBox1: TListBox; ListFensterButton: TButton; GetListViewButton: TButton; procedure ListFensterButtonClick(Sender: TObject); procedure GetListViewButtonClick(Sender: TObject); procedure get_lv_items(wnd:hwnd); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function EnumChildProc(wnd:hwnd; lparam:integer):bool;stdcall; var listbox:Tlistbox; classname:array[0..127] of char; begin listbox:=TListbox(lparam); getclassname(wnd,classname,127); listbox.Items.add('$'+inttohex(wnd,8)+'='+classname); end; procedure TForm1.ListFensterButtonClick(Sender: TObject); var wnd:hwnd; begin wnd:=findwindow(nil,'Windows Media Player'); listbox1.Items.Add(inttohex(wnd,8)); enumchildwindows(wnd,@enumchildproc,integer(self.ListBox1)); end; procedure TForm1.GetListViewButtonClick(Sender: TObject); var wnd:hwnd; i,count:integer; item:lv_item; processid:integer; begin wnd:=0; for i:=0 to listbox1.Count-1 do if listbox1.Selected[i] then begin wnd:=strtoint(listbox1.Items.Names[i]); break; end; listbox1.Clear; get_lv_items(wnd); end; procedure TForm1.get_lv_items(wnd:hwnd); var i,count:integer; item:lv_item; pitem:pointer; process,processid:cardinal; text:array[0..127] of char; ptext:pointer; tmp:cardinal; begin //Anzahl der Einträge in Listview ermitteln count:=sendmessage(wnd,lvm_getitemcount,0,0); listbox1.Items.Add('Anzahl: '+inttostr(count)); //ID vom Zielprocess ermitteln getwindowthreadprocessid(wnd,processid); if processid=0 then raise Exception.create('Fehler bei ProcessID'); //Handle auf Zielprocess bekommen process:=openprocess(PROCESS_ALL_ACCESS,false,processid); if process=0 then raise Exception.Create('Kein Zugriff auf Process'); try //Speicher für String im fremden Process reservieren ptext:=virtualallocEx(process,nil,sizeof(text),mem_commit,PAGE_READWRITE); if ptext=nil then raise Exception.Create('Kein freier Speicher im Process'); //Speicher für Record im fremden Process reservieren pitem:=virtualallocEx(process,nil,sizeof(lv_item),mem_commit,PAGE_READWRITE); if pitem=nil then begin virtualfreeEx(process,ptext,sizeof(text),mem_decommit); raise Exception.Create('Kein freier Speicher im Process'); end; //Record füllen (mit pszText auf reservierten Speicher für String item.mask:=LVIF_TEXT; item.iSubItem:=0; item.pszText:=ptext; item.cchTextMax:=sizeof(text)-1; for i:=0 to count-1 do begin item.iItem:=i; //welchen Eintrag? //record in anderen Process kopieren if writeprocessmemory(process,pitem,@item,sizeof(item),tmp) then begin //Message senden (liest den record und füllt damit psztext, //also den reservierten "Stringspeicher") if bool(sendmessage(wnd,lvm_getitem,0,integer(pitem))) then begin //String auslesen if readprocessmemory(process,ptext,@text,sizeof(text),tmp) then begin //..und anzeigen listbox1.Items.Add(text); end; end; end; end; //Speicher im anderen Process freigeben virtualfreeEx(process,ptext,sizeof(text),mem_decommit); virtualfreeEx(process,pitem,sizeof(lv_item),mem_decommit); finally //Handle freigeben closehandle(process); end; end; end. |
Re: anderes program auslesen
zu deinem code, hab nen getestet, und wenn ich erst die fenster buttons auflisten lass und dann die listview buttons, bekomm ich ne exception.
MfG - Ghost007 |
Re: anderes program auslesen
:gruebel: Hast du auch ein entspr Listview selektiert?
|
Re: anderes program auslesen
irgendwie listet er nu nichma mehr die henster handle auf ... es passiert einfach gar nix (windows media player is offen)
:gruebel: MfG - Ghost007 |
Re: anderes program auslesen
Stimmt denn noch der Titel überein?
Du kannst auch die eine Funktion, welche das ListView ausliest in dein Programm kopieren und entsprechend einbinden :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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