1

我正在使用 Windows XP SP 3,Strawberry Perl。我想让我的 Perl 程序的用户选择一个文件;但是当使用 Win32::GUI::GetOpenFileName() 时,我希望 Windows 文件选择对话框在“详细信息”文件列表选项中打开,而不是在默认的“列表”文件列表选项中打开。

上网一搜,好像得用windows的“钩子”功能,给文件选择控件发一些信息。关于它的文档是 MSDN,我似乎不掌握如何在 Perl 中应用它。

谁能推荐 Perl 中正确的调用语法应该是什么?

这是我的代码示例,其中文件选择对话框使用(默认)“列表”选项打开:

 use strict;
 use warnings;
 use 5.014;    
 use Win32::Console;
 use Win32::GUI();
 use autodie; 
 use warnings    qw< FATAL  utf8     >;
 use Carp::Always;
 use Win32API::File::Time qw{:win};
use Image::ExifTool qw(:Public);
use Date::Parse;

# ...
my ( $FileName, $ImageDir, $DIR, $TopDir);
# ...
$TopDir = 'D:\My Documents';
    $ImageDir = Win32::GUI::BrowseForFolder( -root => $TopDir, -includefiles => 1,);
    unless ($ImageDir) { 
        say '$DirName not defined after calling Win32::GUI::BrowseForFolder, ',
        'Photo date set line'.__LINE__;
        exit;
    }
    else {
        say "Identified directory: $ImageDir";
    }    
    # now select a file

    $FileName = Win32::GUI::GetOpenFileName( -title  => 'Select an image file', -directory => $ImageDir,
        -file   => "\0" . " " x 256,
        -filter => ["Image files (*.jpg)" => "*.jpg;*.jpeg", "All files", "*.*", ],);
    unless ($FileName) {
        say '$FileName not defined after calling Win32::GUI::GetOpenFileName, ',
        'Photo date set line'.__LINE__;
    }
    else {
        say "Identified image file: $FileName";
    }
# ...

注意:(有点)类似的帖子:http ://www.perlmonks.org/?node_id=989418

4

1 回答 1

2

不幸的是,Win32::GUIAPI 既不公开OFN_ENABLEHOOK标志位也不公开选项lpfnHook字段。GetOpenFileName

您也许可以使用该Win32::API模块使其在更低级别上工作,但您必须OPENFILENAME使用自己构建整个结构pack并为钩子处理程序编写一些 XS 代码。

于 2012-08-25T18:39:18.100 回答