Text aus Win32-Statusleiste auslesen
Text aus Win32-Statusleiste auslesen
am 08.03.2007 19:12:50 von Tobias Nissen
Moin!
Ich möchte mit Hilfe von Win32::GUI den Text einer Statusleiste
auslesen. Da ich nicht herausgefunden habe, wie ich bei Win32::GUI den
Handle einer fremden Statusleiste bekomme, benutze ich FindWindowEx der
Winapi mit Hilfe von Win32::API. Folgendes Codestück (bzw. der Aufruf
von GetText) bringt aber jede (OK, erst mit zwei gestestet, aber ich
nehme es mal an) Anwendung zum Absturz:
-->8-------------------------------------------------------- ------------
my $FindWindowEx =3D new Win32::API(
'User32', 'FindWindowEx', 'NNPP', 'N');=20
# außer bei Notepad habe ich es noch bei SciTE mit 'SciTEWindow'
# reproduzieren können
my $hwnd =3D Win32::GUI::FindWindow('Notepad', '');
print "hwnd: $hwnd\n";
print Win32::GUI::GetClassName($hwnd), "\n";
my $sbar =3D $FindWindowEx->Call($hwnd, 0, 'msctls_statusbar32', '');
print "sbar: $sbar\n";
print "sbartxt: \"" . Win32::GUI::StatusBar::GetText($sbar, 0) . "\"\n";
-->8-------------------------------------------------------- ------------
Verschickt Win32::GUI da eine Nachricht, die die Anwendungen nicht
verstehen? Oder ist mein Vorgehen vielleicht grundsätzlich falsch?
Für jede Hilfe dankbar,
Tobias
Re: Text aus Win32-Statusleiste auslesen
am 09.03.2007 17:09:27 von Wolf Behrenhoff
Tobias Nissen schrieb:
> Moin!
>
> Ich möchte mit Hilfe von Win32::GUI den Text einer Statusleiste
> auslesen. Da ich nicht herausgefunden habe, wie ich bei Win32::GUI den
> Handle einer fremden Statusleiste bekomme, benutze ich FindWindowEx der
> Winapi mit Hilfe von Win32::API. Folgendes Codestück (bzw. der Aufruf
> von GetText) bringt aber jede (OK, erst mit zwei gestestet, aber ich
> nehme es mal an) Anwendung zum Absturz:
>
> print "sbartxt: \"" . Win32::GUI::StatusBar::GetText($sbar, 0) . "\"\n";
Hm, ich habe leider nicht so viel Ahnung von Perl-Programmierung mit
Win32::*, aber ich habe mal schnell ein eigenes Programm mit Statusbar
in Delphi zusammengeklickt und auch das wird zum Absturz gebracht.
Interessant finde ich allerdings, dass Win32::GUI::StatusBar::IsSimple
funktioniert und auch auch den richtigen Wert zurückliefert.
Ich frage mich allerdings, wie die StatusBar funktioniert - ich könnte
mir vorstellen, dass diese Funktionen nur für selbst mit new erstellte
StatusBars funktionieren, hast du das mal ausprobiert?
Warum möchtest du überhaupt die Statusbar auslesen, kann man nicht einen
"normalen" IPC-Weg nehmen?
Wolf
Re: Text aus Win32-Statusleiste auslesen
am 10.03.2007 10:45:46 von Tobias Nissen
Wolf Behrenhoff wrote:
[...]
> Ich frage mich allerdings, wie die StatusBar funktioniert - ich könnte
> mir vorstellen, dass diese Funktionen nur für selbst mit new erstellte
> StatusBars funktionieren, hast du das mal ausprobiert?
Wenn ich ein separates Programm mit Statusleiste erstelle, und auf
obigem Wege (also von außen) den Text abfrage, stürzt es auch ab. Im
Programm selbst funktioniert GetText natürlich...
> Warum möchtest du überhaupt die Statusbar auslesen, kann man nicht
> einen "normalen" IPC-Weg nehmen?
Was wäre ein normaler IPC-Weg? Mit SendMessage/PostMessage zu
arbeiten?
Schöne Grüße,
Tobias
Re: Text aus Win32-Statusleiste auslesen
am 10.03.2007 10:47:26 von Tobias Nissen
Tobias Nissen wrote:
[...]
> Wenn ich ein separates Programm mit Statusleiste erstelle,
D.h. mit Win32::GUI und new, wie vorgeschlagen.
Re: Text aus Win32-Statusleiste auslesen
am 10.03.2007 12:31:49 von Bjoern Hoehrmann
* Tobias Nissen wrote in de.comp.lang.perl.misc:
>Verschickt Win32::GUI da eine Nachricht, die die Anwendungen nicht
>verstehen? Oder ist mein Vorgehen vielleicht grundsätzlich falsch?
Win32::GUI übergibt der Anwendung eine Addresse an der sie den Text
speichern soll. Die Adresse ist aber nur für den Perl-Prozess gültig,
die Anwendung überschreibt also entweder eigene Daten zufällig, oder
das Betriebsystem merkt, dass die Addresse nicht gülitg ist und be-
endet die Anwendung.
Ich glaube das Problem lässt sich nur umgehen, indem du eigene DLL
schreibst und die in den Prozess der Anwendung lädst; das geht mit
SetWindowsHookEx() und Co. Dazu reicht im Prinzip ein wenig Perl XS
code (der XS-Teil wird in eine DLL kompiliert die sich dann selbst
entsprechend laden kann); ich hab das mal gemacht um meine Notebook
Audiosteuerungstasten umzuleiten, ist allerdings zu lange her um da
genauere Vorschläge zu machen.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/
Re: Text aus Win32-Statusleiste auslesen
am 15.03.2007 12:26:13 von Reinhard Pagitsch
Hallo Tobias,
Tobias Nissen wrote:
> Moin!
>=20
> Ich möchte mit Hilfe von Win32::GUI den Text einer Statusleiste
> auslesen. Da ich nicht herausgefunden habe, wie ich bei Win32::GUI den
> Handle einer fremden Statusleiste bekomme, benutze ich FindWindowEx der=
> Winapi mit Hilfe von Win32::API. Folgendes Codestück (bzw. der Aufruf=
> von GetText) bringt aber jede (OK, erst mit zwei gestestet, aber ich
> nehme es mal an) Anwendung zum Absturz:
>=20
> -->8-------------------------------------------------------- -----------=
-
> my $FindWindowEx =3D new Win32::API(
> 'User32', 'FindWindowEx', 'NNPP', 'N');=20
>=20
> # außer bei Notepad habe ich es noch bei SciTE mit 'SciTEWindow'
> # reproduzieren können
> my $hwnd =3D Win32::GUI::FindWindow('Notepad', '');
> print "hwnd: $hwnd\n";
>=20
> print Win32::GUI::GetClassName($hwnd), "\n";
>=20
> my $sbar =3D $FindWindowEx->Call($hwnd, 0, 'msctls_statusbar32', '');
> print "sbar: $sbar\n";
>=20
> print "sbartxt: \"" . Win32::GUI::StatusBar::GetText($sbar, 0) . "\"\n"=
;
> -->8-------------------------------------------------------- -----------=
-
>=20
> Verschickt Win32::GUI da eine Nachricht, die die Anwendungen nicht
> verstehen? Oder ist mein Vorgehen vielleicht grundsätzlich falsch?
>=20
> Für jede Hilfe dankbar,
> Tobias
So einfach ist das nicht. Dein Perl Script muss sich an den fremden=20
Prozess "anhängen". D.h. es muss Speicher von diesem Prozess sozusagen =
stehlen. Win32::GUI wird das,so glaub ich, nicht können.
Aber eine Lösung für ein XS Modul habe ich bereits, noch nicht ganz=20
fertig aber es gibt bereits die Werte von Statuszeilen mit mehreren=20
Teilen auf der Commandozeile aus.
Wenn Du möchtest kann ich Dir den Code zuschicken. Ach ja Hooks sind da=
=20
nicht notwendig.
Grüße,
Reinhard
--=20
PM Mails an rpirpag gmx dot at