Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Statusbar auslesen (https://www.delphipraxis.net/112988-statusbar-auslesen.html)

ghost007 30. Apr 2008 17:17


Statusbar auslesen
 
Hallo,
ich will per sendmessages die statusbar des VLC players auslesen, folgendes hab ich versucht:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
 var
  sb:THandle;
  length: Integer;
  item: PChar;
begin
 sb := FindWindow('wxWindowClassNR','VLC media player');
 sb := FindWindowEx(sb, 0, 'msctls_statusbar32', nil);
 //Erstes Item
 length := SendMessage(sb, SB_GETTEXTLENGTH, 0, 0);
 GetMem(item, length + 1);
 SendMessage(sb, SB_GETTEXT, 0, Integer(item));
 Label4.Caption := item;
 FreeMem(item);
 //DONE
end;
nur jedesmal wenn ich den code ausführe geht der VLC player hopps :(

MfG - Ghost007

1234588 30. Apr 2008 17:28

Re: Statusbar auslesen
 
//sry, was falsch verstanden :o)

Luckie 30. Apr 2008 18:16

Re: Statusbar auslesen
 
Das geht so nicht. Siehe hier: http://www.michael-puff.de/Artikel/2...sComCtrl32.php

bitsetter 30. Apr 2008 18:41

Re: Statusbar auslesen
 
Falls du nur das 1. Feld der Statusbar auslesen möchtest, (beim VCL Player steht da die Laufzeit des Videos) dann kannst du es auch einfach mit WM_GETTEXT auslesen.

ghost007 1. Mai 2008 22:21

Re: Statusbar auslesen
 
Hi,
ich habs jetzt mal anders versucht ... doch irgendwie hab ich glaub ich noch irgendwo den wurm drin.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
 const
  BufferSize = 1024;
 var
  ProcessID: DWORD;
  Proc,BytesR, BytesW: Cardinal;
  MemOwn, MemFor : Pointer;
  length:integer;
  sb:THandle;
begin
 //StatusbarHandle ermitteln
 sb := FindWindow('wxWindowClassNR','VLC media player');
 sb := FindWindowEx(sb, 0, 'msctls_statusbar32', nil);
 //Done
 //ProcessID + ProcessHandle ermitteln
 GetWindowThreadProcessId(sb, @ProcessId);
 Proc := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
 //Done
 //Speicher Reservieren
 MemOwn := VirtualAlloc(nil, BufferSize, MEM_COMMIT, PAGE_READWRITE);
 MemFor := VirtualAllocEx(Proc, nil, BufferSize, MEM_COMMIT, PAGE_READWRITE);
 //Done
 //In Fremdanwendung schreiben und kopieren
 WriteProcessMemory(Proc, MemFor, MemOwn, BufferSize, BytesW);
 SendMessage(sb,SB_GETTEXT, 0, LPARAM(MemFor));
 length:= SendMessage(sb,SB_GETTEXTLENGTH,0,0);
 ReadProcessMemory(Proc, MemFor, MemOwn, BufferSize, BytesR);
 //Done
 //Daten auslesen
 Label4.Caption := PChar(Cardinal(MemOwn) + length + 1);
 //Done
 //Reservierten Speicher wieder freigeben
 VirtualFreeEx(Proc, MemFor, 0, MEM_RELEASE);
 VirtualFree(MemOwn, 0, MEM_RELEASE);
 CloseHandle(Proc);
 //Done
end;
Wo liegt mein denkfehler?

MfG - Ghost007

bitsetter 2. Mai 2008 20:42

Re: Statusbar auslesen
 
Zitat:

Zitat von ghost007
Hi,
ich habs jetzt mal anders versucht ... doch irgendwie hab ich glaub ich noch irgendwo den wurm drin.

Delphi-Quellcode:
...
 Label4.Caption := PChar(Cardinal(MemOwn) + length + 1);
...
Wo liegt mein denkfehler?

MfG - Ghost007

Hi,

was willst du denn hinter den Text noch auslesen, das length + 1 kannst du dir sparen.
WriteProcessMemory kennst du dir IMHO auch noch sparen.

toms 2. Mai 2008 20:57

Re: Statusbar auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich hab's mal so gemacht:

Delphi-Quellcode:
uses
  CommCtrl, uProcessMemMgr;

function GetStatusBarText(hStatusBarHandle: HWND; PanelNumber: Integer): string;
var
  PMM: TProcessMemMgr;
  NumberOfPanels, Len: Integer;
  PrcBuf: PChar;
  PartText: string;
begin
  if hStatusBarHandle = 0 then Exit;
  PMM := CreateProcessMemMgrForWnd(hStatusBarHandle);
  try
    NumberOfPanels := SendMessage(hStatusBarHandle, SB_GETPARTS, 0, 0);
    if PanelNumber < NumberOfPanels then
    begin
      Len := LOWORD(SendMessage(hStatusBarHandle, SB_GETTEXTLENGTH, PanelNumber, 0));
      if Len > 0 then
      begin
        PrcBuf := PMM.AllocMem(Len + 1);
        SendMessage(hStatusBarHandle, SB_GETTEXT, PanelNumber, Longint(PrcBuf));
        Result := PMM.ReadStr(PrcBuf);
        PMM.FreeMem(PrcBuf);
      end
      else
      begin
        Result := '';
      end;
    end;
  finally
    PMM.Free;
  end;
end;

ghost007 2. Mai 2008 21:06

Re: Statusbar auslesen
 
Danke erstmal, die method von toms funktioniert.
Werde die mir nun ma schritt für schritt anguggen und das nachvollziehen ;)

MfG - Ghost007

Haeger23 8. Mai 2008 15:38

Re: Statusbar auslesen
 
Hallo,

ich hoffe es ist kein Problem wenn ich mit einsteige.
Sitze nämlich grad an einem ähnlichen Problem.

Undzwar möchte ich auch gern an den Inhalt des
Statusbar einer anderen Anwendung allerdings an den dritten Eintrag.

Geht das überhaupt?

Grüße

toms 8. Mai 2008 15:47

Re: Statusbar auslesen
 
Hallo, siehe meine Funktion oben. Dort kannst du die Pannel Nummer übergeben.
Delphi-Quellcode:
function GetStatusBarText(hStatusBarHandle: HWND; PanelNumber: Integer): string;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 Uhr.
Seite 1 von 2  1 2      

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