AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Werte aus der Statusleiste eines fremden Programms erhalten
Thema durchsuchen
Ansicht
Themen-Optionen

Werte aus der Statusleiste eines fremden Programms erhalten

Ein Thema von Cuchulainn · begonnen am 15. Jan 2004 · letzter Beitrag vom 15. Jan 2004
Antwort Antwort
Cuchulainn

Registriert seit: 26. Aug 2003
182 Beiträge
 
Delphi 5 Enterprise
 
#1

Werte aus der Statusleiste eines fremden Programms erhalten

  Alt 15. Jan 2004, 08:22
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?
  Mit Zitat antworten Zitat
MikeS

Registriert seit: 3. Mai 2003
Ort: München
157 Beiträge
 
Delphi 7 Professional
 
#2

Re: Werte aus der Statusleiste eines fremden Programms erhal

  Alt 15. Jan 2004, 09:57
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??

[edit=Sharky]Doppeposting gelöscht Mfg, Sharky[/edit]
Mike Schröder
  Mit Zitat antworten Zitat
Cuchulainn

Registriert seit: 26. Aug 2003
182 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Werte aus der Statusleiste eines fremden Programms erhal

  Alt 15. Jan 2004, 10:23
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Werte aus der Statusleiste eines fremden Programms erhal

  Alt 15. Jan 2004, 10:39
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Cuchulainn

Registriert seit: 26. Aug 2003
182 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Werte aus der Statusleiste eines fremden Programms erhal

  Alt 15. Jan 2004, 11:05
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.
  Mit Zitat antworten Zitat
ritzy

Registriert seit: 11. Jan 2004
12 Beiträge
 
#6

Re: Werte aus der Statusleiste eines fremden Programms erhal

  Alt 15. Jan 2004, 19:18
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.
Der Unterschied zwischen einem Job und einer Karriere beträgt mindestens 20 Stunden in der Woche.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: Werte aus der Statusleiste eines fremden Programms erhal

  Alt 15. Jan 2004, 20:09
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)
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 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