Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Werte aus der Statusleiste eines fremden Programms erhalten (https://www.delphipraxis.net/14755-werte-aus-der-statusleiste-eines-fremden-programms-erhalten.html)

Cuchulainn 15. Jan 2004 07:22


Werte aus der Statusleiste eines fremden Programms erhalten
 
Ich habe folgendes Problem: Wir benutzen in unserer Firma ein Programm, dessen Statusleiste ich auslesen soll. Da niemand von euch das Programm kennen wird, verwende ich in meinem Quelltext, den ich hier poste, den Internet Explorer. Ich habe das eben nur geschrieben um zu sagen, dass mir irgendwelche Automationsschittstellen für den Internet Explorer nicht weiterhelfen, da ich auf ein anderes Programm zugreifen möchte.

Mein Quelltext sieht bis jetzt folgendermaßen aus:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var finder: THandle;
    finder2: THandle;
    text2: pchar;
begin
     text1 := StrAlloc(20);
     finder := FindWindow('IEFrame', 'about:blank - Microsoft Internet Explorer');
     if finder <> 0 then
     begin
          finder2 := FindWindowEx(finder, 0, 'msctls_statusbar32', Nil);
     end;
     if finder2 <> 0 then
     begin
          SendMessage(finder2, SB_GETTEXT, 0, LongInt(text));        
     end;
     Edit1.Text := StrPas(text2);
     StrDispose(text2);
Ein Programmierlehrer hat mir erklärt wie das mit C++ funktionieren würde. Leider kennt er sich mit Delphi überhaupt nicht aus. Das Prinzip von seinem C++-Quelltext habe ich übernommen. Es funktioniert auch ohne Fehlermeldung, leider wird mir in Edit1 nichts ausgegeben.
Kann mir da vielleicht jemand weiterhelfen?

MikeS 15. Jan 2004 08:57

Re: Werte aus der Statusleiste eines fremden Programms erhal
 
Moin

Vielleicht sehe ich es einfach nur nicht, aber
ich kann keine Stelle finden an der du "Text2" etwas zuweist.

text2 willst du aber laut deinem code im edit1.text anzeigen!

oder habe ich das problem nicht verstanden?? :gruebel:

[edit=Sharky]Doppeposting gelöscht :stupid: Mfg, Sharky[/edit]

Cuchulainn 15. Jan 2004 09:23

Re: Werte aus der Statusleiste eines fremden Programms erhal
 
Okay, das war mein Fehler. Tut mir leid. Ich habe viel auskommentiert und gelöscht. Dabei hat es die falschen Textstellen erwischt.

Hier ist der richtige Text:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var finder: THandle;
    finder2: THandle;
    text: pchar;
begin
     text := StrAlloc(20);
     finder := FindWindow('IEFrame', 'about:blank - Microsoft Internet Explorer');
     if finder <> 0 then
     begin
          finder2 := FindWindowEx(finder, 0, 'msctls_statusbar32', Nil);
     end;
     if finder2 <> 0 then
     begin
          SendMessage(finder2, SB_GETTEXT, 0, LongInt(text));
     end;
     Edit1.Text := StrPas(text);
     StrDispose(text);
end;

Luckie 15. Jan 2004 09:39

Re: Werte aus der Statusleiste eines fremden Programms erhal
 
Das wird so nicht gehen. Ein Edit oder eine Listbox kann man so auslesen aber keine Statusbar. Grund ist der es ging unter 16-Bit Windows ohne Probleme auf den Speicher eines fremden Prozesses zu zugreifen. Unter 32-Bit Windows geht das nicht mehr. Damit aber die 16-Bit Programme noch kompatible waren, hat Microsoft dafür gesorgt, dass es bei den Controlls, die noch aus der 16-Bit Zeit stammen noch geht, eben Listboxen, Edits etc. Die Statusbar, Listview, Treeview stammen aber aus der 32-Bit Zeit und da hat Microsoft keiner Veranlassung gesehen dies auch für die CommenControlls zu machen.

Unter NT ff. kannst du mit VirtuakAllovcEx dir Speicher im fremnden Prozess reservieren, mit WriteProcessMemory die Struktur üllen und dann mit ReadProcessesMemory die Struktur in eine identische Struktur im Speicher kopieren. Wie das geht habe ich mit meinen LuckieDips mit einem Listview vorgemacht. Das Programm findest du mit Source und ausführlich kommentiert auf meiner Homepage.

Cuchulainn 15. Jan 2004 10:05

Re: Werte aus der Statusleiste eines fremden Programms erhal
 
Zitat:

Zitat von Luckie
Das wird so nicht gehen. Ein Edit oder eine Listbox kann man so auslesen aber keine Statusbar.

Bist du sicher? Unser Programmierlehrer hat gesagt, er hätte es auf die Art mit C++ geschafft. Ich sehe mir deine LuckieDips mal an. Danke.

ritzy 15. Jan 2004 18:18

Re: Werte aus der Statusleiste eines fremden Programms erhal
 
Hi,
interessantes Thema, aber kann man sich nicht normalerwies sogar den gesamten Speicher eines Fensters ausgeben lassen?
Ich weis das es mit C++ auf jeden Fall geht aber ich will das halt mit Delphi machen.

toms 15. Jan 2004 19:09

Re: Werte aus der Statusleiste eines fremden Programms erhal
 
Zitat:

Das wird so nicht gehen. Ein Edit oder eine Listbox kann man so auslesen aber keine Statusbar.
Hi,

Das stimmt nur bedingt.
Den ersten Panel der Statusbar kann man ohne VirtuakAllovcEx oder sonstiges auslesen.
Und zwar so:

Delphi-Quellcode:
function GetStatusBarText(wndWindow: THandle;
  StatusBarClassName: string;
  PanelIndex: Byte): string;
const
  SB_GETTEXT = $0402;
var
  WndStatusBar: THandle;
  StatusBarText: array[0..$FFF] of Char;
begin
  Result := '';
  WndStatusBar := FindWindowEx(wndWindow, 0, PChar(StatusBarClassName), nil);
  if WndStatusBar <> 0 then
  begin
    if PanelIndex = 0 then
      SendMessage(WndStatusBar, WM_GETTEXT, $FFF, Longint(@StatusBarText))
    else
      SendMessage(WndStatusBar, SB_GETTEXT, PanelIndex, Longint(@StatusBarText));
    Result := StrPas(StatusBarText);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Read statustext from Internet Explorer
  label1.Caption := GetStatusBarText(FindWindow('IEFrame', nil), 'msctls_statusbar32', 0);
end;
Man kann auch die Panels 1...n auslesen.
Dazu habe ich hier. mal ein Beispiel geschrieben (unterer Code)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 Uhr.

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