如何在 windows 上使用 perl 调用系统文件选择对话框?

How to call a system file selection dialog using perl on windows?

我知道许多基于 perl 的 gui 模块可以轻松做到这一点,但我对 Prima 或 [=19= 以外的方法很好奇]Tk等
我想为命令行包调用此对话框(完全看起来像 Windows Explorer)。

是否有类似于system('');命令的东西。

请注意,我需要通过 perl 打开并处理由此类对话框选择的 file/s。

这并不容易,首先您必须构建 OpenFileDialog api 所需的数据结构,在低级别与系统交互,跟踪文件句柄,然后获取并解析结果结构。

有一些可怕的技巧,您可以在其中保存 windows 脚本,然后使用您建议的系统从 perl 运行 中保存它。请记住,这需要正确的权限和安装的脚本语言。

# From http://www.pcreview.co.uk/threads/launching-a-search-explorer-exe-form-the-command-line.1468270/
system( q{"echo CreateObject("Shell.Application").FindFiles >%temp%\myff.vbs"} ); #setup script
my @files = system( "cscript.exe //Nologo %temp%\myff.vbs" ); # Get files
system( "del %temp%\myff.vbs" ); # Cleanup

Win32::GUI 的作者在简化方面做得很好,

my @file = Win32::GUI::GetOpenFileName ();

或者使用一些有用的选项,例如过滤、起始目录和 window 标题。

# A simple open file with graphic filers
my ( @file, $file );
my ( @parms );
push @parms,
  -filter =>
    [ 'TIF - Tagged Image Format', '*.tif',
      'BMP - Windows Bitmap', '*.bmp',
      'GIF - Graphics Interchange Format', '*.gif',
      'JPG - Joint Photographics Experts Group', '*.jpg',
      'All Files - *', '*'
    ],
  -directory => "c:\program files",
  -title => 'Select a file';
push @parms, -file => $lastfile  if $lastfile;
@file = Win32::GUI::GetOpenFileName ( @parms );