【问题标题】:cross-platform techniques to determine screen dimensions确定屏幕尺寸的跨平台技术
【发布时间】:2022-09-23 02:18:31
【问题描述】:

有没有一种很好的跨平台获取屏幕尺寸的方法? 我经常用 PerlTk 这样做:

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

但最好不必为了执行此操作而加载所有 Tk。

这看起来像是做这些事情的一种很好的 X11 特定方式(GetRootWindow 应该适用于屏幕尺寸):

Perl: Getting the geometry of a window with X11 WindowID

但我认为跨平台的方法会更好。

具体来说,我正在寻找以像素为单位确定显示器尺寸的方法,这就是 Tk 的屏幕宽度和屏幕高度返回的值。

  • “屏幕”是什么意思?不会是显示器吧?或者应用程序打开或运行的窗口? (在 Win / Linux 上是什么?)
  • 是的,屏幕宽度和屏幕高度是以像素为单位的显示器尺寸。
  • 在 x11 下可以使用 X11 工具(如xrandr),在 Windows 上可以使用Win32::APIWin32::GUI(并在子系统中进行选择)。我没有看到一个干净的便携式方式。

标签: perl


【解决方案1】:

在大多数 POSIX-y 系统上:

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

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

【讨论】:

  • 该问题提到了Tk::Widget::screenwidth(),它返回像素尺寸而不是字符列。
【解决方案2】:

我能看到的获得显示/屏幕分辨率的最好方法是使用特定于操作系统的工具。

在 X11 上,最好的选择可能是 xrandr而在 Windows 上则为 Win32::GUIWin32::API

然后将其包装在检查操作系统并选择要使用的工具的子程序中。

(或者当然使用一个 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 输出就像

屏幕 0:最小 8 x 8,当前 5040 x 1920,最大 32767 x 32767
DP-0连接初级1920x1200+3120+418(正常左倒右x轴y轴)519mm x 320mm
   1920x1200 59.95*+
   1600x1200 60.00
   1280x1024 75.02 60.02
   1152x864 75.00
...

它继续运行,然后用于所有显示器。

所以我选择第一个列出的最高分辨率(“主要”)

【讨论】:

  • 我现在无法在 Windows 上运行代码,但如果对此感兴趣,我可以稍后发布特定代码。
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2011-12-08
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多