gpt4 book ai didi

windows - 我如何确保使用 Perl 的 Imager::Screenshot 截取特定窗口的屏幕截图?

转载 作者:可可西里 更新时间:2023-11-01 09:48:20 26 4
gpt4 key购买 nike

我使用 Imager::Screenshot在我的 Perl 代码中,它确实有效并截取了屏幕截图。

现在,每次浏览器都在不同的位置打开,这意味着开始的 x 和 y 位置可能不一样。

有没有办法从浏览器而不是桌面起始位置开始截屏。

如果不是(与编程无关)是否有办法将浏览器设置为仅以全尺寸打开,无论它是从什么程序打开的。单击图标时由用户打开,或由 Perl 使用 Win32::OLE 打开模块。

最佳答案

您可以使用 Win32::GuiTest::FindWindowLike查找与浏览器关联的窗口句柄并将其指定为 screenshot:

#!/usr/bin/env perl

use strict; use warnings;
use Const::Fast;
use Imager;
use Imager::Screenshot qw( screenshot );
use Win32::GuiTest qw( FindWindowLike SetForegroundWindow );

const my $TYPE => 'bmp';

my @windows = FindWindowLike(0,
'(?:Mozilla Firefox)|(?:Internet Explorer)|(?:Opera)'
);

for my $hwnd (@windows) {
warn "$hwnd\n";
SetForegroundWindow $hwnd;
sleep 1;
my $img = screenshot(hwnd => $hwnd, decor => 1);
die Imager->errstr unless $img;

$img->write(file => "$hwnd.$TYPE", type => $TYPE)
or die $img->errstr;
}

上面的代码将分别截取整个 IE 窗口和包含当前选项卡的子窗口的屏幕截图。如果您只对顶级 IE 窗口感兴趣,您会想使用 my @windows = FindWindowLike(0, 'Internet Explorer', '^IEFrame');

此外,如果您打开了 "InternetExplorer.Application"使用 Win32::OLE 的窗口,您可以访问对象的 Top , Height , 和 Width属性来确定其位置和面积。另外,你可以得到它的HWND以便您可以将其设置为前景窗口。

#!/usr/bin/env perl

use strict; use warnings;
use Const::Fast;
use Imager;
use Imager::Screenshot qw( screenshot );
use Win32::GuiTest qw( SetForegroundWindow );
use Win32::OLE;
$Win32::OLE::Warn = 3;

const my $TYPE => 'bmp';

const my $READYSTATE_COMPLETE => 4;

my $browser = Win32::OLE->new("InternetExplorer.Application");
$browser->Navigate('http://www.example.com/');

sleep 1 while $browser->{ReadyState} != $READYSTATE_COMPLETE;
$browser->{Visible} = 1;

my $hwnd = $browser->{HWND};
SetForegroundWindow $hwnd;
sleep 1;

my $img = screenshot(hwnd => $hwnd, decor => 1) or die Imager->errstr;

my $title = $browser->{LocationName};
$browser->Quit;

$title =~ s/[^A-Za-z0-9_-]/-/g;
$img->write(file => "$title.$TYPE", type => $TYPE) or die $img->errstr;

或者,using OLE events :

#!/usr/bin/env perl
use strict; use warnings;
use feature 'say';
use Const::Fast;
use Imager;
use Imager::Screenshot qw( screenshot );
use Win32::GuiTest qw( SetForegroundWindow );
use Win32::OLE qw(EVENTS valof);
$Win32::OLE::Warn = 3;

const my $TYPE => 'bmp';
const my $READYSTATE_COMPLETE => 4;

my ($URL) = @ARGV;
die "Need URL\n" unless defined $URL;

my $browser = Win32::OLE->new(
"InternetExplorer.Application", sub { $_[0]->Quit }
);
Win32::OLE->WithEvents($browser, \&Event, 'DWebBrowserEvents2');

$browser->{Visible} = 1;
$browser->Navigate2($URL);

Win32::OLE->MessageLoop;
Win32::OLE->SpinMessageLoop;

$browser->Quit;
sleep 3;

sub Event {
my ($browser, $event, @argv) = @_;
say $event;

if ($event eq 'DocumentComplete') {
$browser->{ReadyState} == $READYSTATE_COMPLETE
or return;

my $hwnd = $browser->{HWND};
SetForegroundWindow $hwnd;

my $img = screenshot(hwnd => $hwnd, decor => 1)
or die Imager->errstr;

my $url = valof( $argv[1] );
$url =~ s{^https?://}{};
$url =~ s{[^A-Za-z0-9_-]}{-}g;

$img->write(file => "$url.$TYPE", type => $TYPE)
or die $img->errstr;

Win32::OLE->QuitMessageLoop;
}
return;
}

关于windows - 我如何确保使用 Perl 的 Imager::Screenshot 截取特定窗口的屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11219755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com