Win32::Screenshot / Prozesse zu Perl Handle

Win32::Screenshot / Prozesse zu Perl Handle

am 14.03.2006 00:35:16 von Erik

Hallo alle miteinander,

ich habe mal einer Frage zu Windows und Perl, bin da nicht
so bewandert.


Ich lasse mit dem Modul Win32::Process::Info verschiedene
Prozesse / Fenster suchen, von dehnen ich dann die PID habe.

Nun will ich mit Win32::Screenshot einen Screenshot von diesem
Prozess/Fenster machen und will dazu die Funktion
CaptureWindow($handle) benützen.

In der Dokumentation steht folgendes zu CaptureWindow().
"Captures whole window including title and border. Pass the
window handle or the window title as the function parameter "

Was ist den nun mit Handle gemeint ? Bestimmt nicht die PID.

Wie komme ich nun an das Handle oder kann mir einen Prozess mit
Perl "greifen". Ich öffne das den Prozess aber nicht mit Perl
somit habe ich auch keine Handle von vorher.

Hat da jemand ein Idee. Muss ich vielleicht über das Module Win32:API
gehen um irgendwie den Prozess in Perl verfügbar zu machen.

Vielen Dank für eure Anregungen ...

Erik

Re: Win32::Screenshot / Prozesse zu Perl Handle

am 14.03.2006 02:01:52 von Wolf Behrenhoff

Erik schrieb:
> Hallo alle miteinander,
>
> Ich lasse mit dem Modul Win32::Process::Info verschiedene
> Prozesse / Fenster suchen, von dehnen ich dann die PID habe.
>
> Nun will ich mit Win32::Screenshot einen Screenshot von diesem
> Prozess/Fenster machen und will dazu die Funktion
> CaptureWindow($handle) benützen.
>
> In der Dokumentation steht folgendes zu CaptureWindow().
> "Captures whole window including title and border. Pass the
> window handle or the window title as the function parameter "
>
> Was ist den nun mit Handle gemeint ? Bestimmt nicht die PID.

Das Handle ist das Handle :-)
Die PID ist es logischerweise nicht, denn ein Prozess kann ja mehrere
Fenster haben. Unter Windows hat praktisch alles ein Handle, zum
Beispiel ein Fenster - aber auch ein Button.

> Wie komme ich nun an das Handle oder kann mir einen Prozess mit
> Perl "greifen". Ich öffne das den Prozess aber nicht mit Perl
> somit habe ich auch keine Handle von vorher.

Wenn du nun ein Fenster abfotografieren willst, dann kannst du das
Handle zum Beispiel über die Funktion FindWindow bekommen. Dazu musst du
den Klassennamen des Fensters kennen. Das Fenster, in dem ich gerade
schreibe, hat zum Beispiel den Namen "MozillaUIWindowClass". Die Namen
kann man zum Beispiel mit Programmen wie "WinSight" herausbekommen.

Hier ein Script:

use Win32::API;
use strict;
use warnings;
my $FindWindow = new Win32::API("user32", "FindWindow","PP","N") or die;
my $name='Verfassen: Re: Win32::Screenshot / Prozesse zu Perl Handle';
my $klasse='MozillaUIWindowClass';
my $hwnd = $FindWindow->Call($klasse,$name);
print "Handle: $hwnd";

Du solltest mal die Windows-API-Doku nach FindWindow, EnumWindows usw.
durchsuchen.

Wolf

Re: Win32::Screenshot / Prozesse zu Perl Handle

am 14.03.2006 12:03:29 von Erik

Aaahh ... jetzt wird es langsam Tag ;-)

>> Nun will ich mit Win32::Screenshot einen Screenshot von diesem
>> Prozess/Fenster machen und will dazu die Funktion
>> CaptureWindow($handle) benützen.
>> Was ist den nun mit Handle gemeint ? Bestimmt nicht die PID.
>
> Das Handle ist das Handle :-)
> Die PID ist es logischerweise nicht, denn ein Prozess kann ja mehrere
> Fenster haben. Unter Windows hat praktisch alles ein Handle, zum
> Beispiel ein Fenster - aber auch ein Button.
>
>> Wie komme ich nun an das Handle oder kann mir einen Prozess mit
>> Perl "greifen". Ich öffne das den Prozess aber nicht mit Perl
>> somit habe ich auch keine Handle von vorher.
>
> Wenn du nun ein Fenster abfotografieren willst, dann kannst du das
> Handle zum Beispiel über die Funktion FindWindow bekommen. Dazu musst du
> den Klassennamen des Fensters kennen. Das Fenster, in dem ich gerade
> schreibe, hat zum Beispiel den Namen "MozillaUIWindowClass". Die Namen
> kann man zum Beispiel mit Programmen wie "WinSight" herausbekommen.

Ja aber was mache ich wenn ich weder Klassenname noch Fenstername kenne.

Also ich öffne extern 4 Internet Explorer. Die haben alle
unterschiedliche Prozesse, d.h es sind keine Kindprozesse oder ähnliches.

Oder bin ich da vielleicht auf dem Holzweg.

Aber wie um alles komme ich jetzt an die 4 Internet Explorer. Vielleicht
währe es doch eine bessere Lösung die Internet Explorer in Perl so zu
öffnen das ein Handle habe und sie trotzdem weiterlaufen wenn das Perl
Script fertig ist, das müsste ja über Win32::Process gehen, so wie das
verstanden habe.

vielen Danke Wolf .. ich komme der Sache schon näher.
Erik

Re: Win32::Screenshot / Prozesse zu Perl Handle

am 14.03.2006 14:05:02 von Wolf Behrenhoff

Erik schrieb:
> Aaahh ... jetzt wird es langsam Tag ;-)

Dann dir einen guten Morgen! (dabei bin ich doch der Student!)

>>> Nun will ich mit Win32::Screenshot einen Screenshot von diesem
>>> Prozess/Fenster machen und will dazu die Funktion
>>> CaptureWindow($handle) benützen.
>>> Was ist den nun mit Handle gemeint ? Bestimmt nicht die PID.
>>> Wie komme ich nun an das Handle oder kann mir einen Prozess mit
>>> Perl "greifen". Ich öffne das den Prozess aber nicht mit Perl
>>> somit habe ich auch keine Handle von vorher.
>> Wenn du nun ein Fenster abfotografieren willst, dann kannst du das
>> Handle zum Beispiel über die Funktion FindWindow bekommen. Dazu musst du
>> den Klassennamen des Fensters kennen. Das Fenster, in dem ich gerade
>> schreibe, hat zum Beispiel den Namen "MozillaUIWindowClass". Die Namen
>> kann man zum Beispiel mit Programmen wie "WinSight" herausbekommen.
>
> Ja aber was mache ich wenn ich weder Klassenname noch Fenstername kenne.
>
> Also ich öffne extern 4 Internet Explorer. Die haben alle
> unterschiedliche Prozesse, d.h es sind keine Kindprozesse oder ähnliches.

Der IE heißt "IEFrame" (wenn du das gesamte Fenster mit Titelleiste etc.
meinst) - du hast also den Klassennamen.

Irgendwie muss dein Programm ja aber wissen, welches der vier IE-Fenster
du nun capturen willst.

Du könntest zum Beispiel GetForegrundWindow() benutzen, um das Fenster
im Vordergrund zu bekommen (also das, was der User gerade aktiv hat).
Wenn man davor ein sleep setzt, kann man so den User das zu
fotografierende Fenster wählen lassen.

Wolf

Re: Win32::Screenshot / Prozesse zu Perl Handle

am 14.03.2006 14:40:25 von Erik

>> Aaahh ... jetzt wird es langsam Tag ;-)
>
> Dann dir einen guten Morgen! (dabei bin ich doch der Student!)

Student ... das Schicksal habe ich auch anzubieten, zum Glück ;-)


>> Also ich öffne extern 4 Internet Explorer. Die haben alle
>> unterschiedliche Prozesse, d.h es sind keine Kindprozesse oder ähnliches.
>
> Der IE heißt "IEFrame" (wenn du das gesamte Fenster mit Titelleiste etc.
> meinst) - du hast also den Klassennamen.

na super ... die heißen ja alle "IEFrame" wenn ich mehrere offen habe ... :-(

habe das gerade mal mit X-Spy ausprobiert. Dort steht auch das Handle drin
z.B. "$002000E0" kann man das nicht irgendwie verwenden. Wahrscheinlich
nicht den Perl kann damit nix anfangen ... stimmt's.


> Irgendwie muss dein Programm ja aber wissen, welches der vier IE-Fenster
> du nun capturen willst.

> Du könntest zum Beispiel GetForegrundWindow() benutzen, um das Fenster
> im Vordergrund zu bekommen (also das, was der User gerade aktiv hat).
> Wenn man davor ein sleep setzt, kann man so den User das zu
> fotografierende Fenster wählen lassen.

genau .. da wird wohl der Weg nur über GetForgroundWindow() führen.

Also ungefähre nach dem Moto:

- Finde IEXPLORE.EXE
- bringe 1. in den Vordergrund mache Screenshot
- bringe 2. in den Vordergrund mache Screenshot

usw. usw.

ich dachte ich komme da leichter an die Fenster ran. Ich arbeite hier auch
noch remote unter VMWare und die ganze Geschichte ist ein bisschen
langsam ... ich habe ja Zeit .... :-)

aber Vielen Dank für Hilfe ...

Gruß aus der Hauptstadt
Erik