perl 确定屏幕尺寸的跨平台技术

pw136qt2  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(211)

有没有一种很好的跨平台方式来获取屏幕尺寸?我经常使用PerlTk来实现这一点:

use Tk;
 my $mw = MainWindow->new;
 my $screen_width  = $mw->screenwidth();   
 my $screen_height = $mw->screenheight();

但是最好不要为了这样做而加载所有的Tk。
这看起来像是一个很好的X11特定的方式来完成这些事情(GetRootWindow应该适用于屏幕尺寸):
Perl:使用X11 WindowID获取窗口的几何结构
但我认为跨平台的方法会更好。
具体来说,我正在寻找确定以像素为单位的监视器尺寸的方法,这是Tk的screenwidth和screenheight返回的值。

0mkxixxg

0mkxixxg1#

在大多数POSIX-y系统上:

use Curses ();
my $screen_width = $Curses::COLS;
my $screen_height = $Curses::LINES;

调整屏幕大小时,这些值不会自动更新。

anauzrmj

anauzrmj2#

我所能看到的获得显示/屏幕分辨率的最好方法是合并特定于操作系统的工具。
在X11上,最好的选择可能是xrandr †,而在Windows上,最好的选择可能是Win32::GUIWin32::API
然后将其 Package 在一个sub中,该sub检查操作系统(使用$^O等)并选择要使用的工具。
(Or当然使用GUI包,如OP正在使用Perl/Tk
†例如

for my $line_out ( qx(xrandr) ) { 
    #print "--> $line_out";
    if ( my ($wt, $ht) = $line_out =~ /^\s+([0-9]+)\s*x\s*([0-9]+)/ ) { 
        say "Width: $wt, height: $ht";
        last;
    }   
}

有很多方法来解析它,原则上我推荐使用库来管理外部程序(特别是为了得到它们的输出/错误等);这是一个快速演示。
在我的系统上,xrandr输出如下所示

Screen 0: minimum 8 x 8, current 5040 x 1920, maximum 32767 x 32767
DP-0 connected primary 1920x1200+3120+418 (normal left inverted right x axis y axis) 519mm x 320mm
   1920x1200     59.95*+
   1600x1200     60.00  
   1280x1024     75.02    60.02  
   1152x864      75.00  
...

它会一直持续下去,然后是所有的显示器。
因此,我为列出的第一个(“主”)选择最高分辨率

相关问题