Text aus Win32-Statusleiste auslesen

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');

# 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
Tobias Nissen [ Do, 08 März 2007 19:12 ] [ ID #1651954 ]

Re: Text aus Win32-Statusleiste auslesen

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
Wolf Behrenhoff [ Fr, 09 März 2007 17:09 ] [ ID #1653112 ]

Re: Text aus Win32-Statusleiste auslesen

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
Tobias Nissen [ Sa, 10 März 2007 10:45 ] [ ID #1653756 ]

Re: Text aus Win32-Statusleiste auslesen

Tobias Nissen wrote:
[...]
> Wenn ich ein separates Programm mit Statusleiste erstelle,

D.h. mit Win32::GUI und new, wie vorgeschlagen.
Tobias Nissen [ Sa, 10 März 2007 10:47 ] [ ID #1653757 ]

Re: Text aus Win32-Statusleiste auslesen

* 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 [at] 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/
Bjoern Hoehrmann [ Sa, 10 März 2007 12:31 ] [ ID #1653758 ]

Re: Text aus Win32-Statusleiste auslesen

Hallo Tobias,


Tobias Nissen wrote:
> 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');
>
> # 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

So einfach ist das nicht. Dein Perl Script muss sich an den fremden
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
fertig aber es gibt bereits die Werte von Statuszeilen mit mehreren
Teilen auf der Commandozeile aus.

Wenn Du möchtest kann ich Dir den Code zuschicken. Ach ja Hooks sind da=

nicht notwendig.

Grüße,
Reinhard

--
PM Mails an rpirpag <at> gmx dot at
Reinhard Pagitsch [ Do, 15 März 2007 12:26 ] [ ID #1659011 ]
Perl » de.comp.lang.perl.misc » Text aus Win32-Statusleiste auslesen

Vorheriges Thema: Dynamic Loading
Nächstes Thema: Zweimal shift macht Probleme