Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi anderes program auslesen (https://www.delphipraxis.net/89587-anderes-program-auslesen.html)

Luckie 12. Mai 2007 12:15

Re: anderes program auslesen
 
Zitat:

Zitat von Timi-loader
ich hab mal probiert ein listview meines andern eigenen programmes auszulesen. bekomme ich auch nicht hin.

Ein Listview ist auch was komplett anderes.

ghost007 12. Mai 2007 12:54

Re: anderes program auslesen
 
Zitat:

Zitat von Timi-loader
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); )

Hi, hatte gestern abend mit deinem code noch ein wenig "rumgespielt", und hab auch festgestellt, das er nicht funktioniert, wenn mehrere gleiche komponenten in dem fenster sind.

MfG - Ghost007

CCRDude 12. Mai 2007 13:19

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.

sirius 12. Mai 2007 16:17

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:
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.
Damit kann man z.B. die Playlist auslesen.

ghost007 12. Mai 2007 19:51

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

sirius 13. Mai 2007 00:11

Re: anderes program auslesen
 
:gruebel: Hast du auch ein entspr Listview selektiert?

ghost007 13. Mai 2007 00:15

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

sirius 13. Mai 2007 10:52

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 05:08 Uhr.
Seite 2 von 2     12   

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