“如何使用Windows”;钩函数“;使用Perl Win32::GUI?

“如何使用Windows”;钩函数“;使用Perl Win32::GUI?,perl,winapi,user-interface,hook,Perl,Winapi,User Interface,Hook,我正在使用WindowsXPSP3,草莓Perl。 我想让Perl程序的用户选择一个文件;但是当使用Win32::GUI::GetOpenFileName()时,我希望Windows文件选择对话框在“详细信息”文件列表选项中打开,而不是在默认的“列表”文件列表选项中打开 在网上搜索,似乎我不得不使用Windows的“钩子”功能,并向文件选择控件发送某些消息。关于这一点的文档是MSDN,我似乎不掌握如何在Perl中应用它 有谁能推荐Perl中正确的调用语法吗 这是我的代码示例,其中文件选择对话框将

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

在网上搜索,似乎我不得不使用Windows的“钩子”功能,并向文件选择控件发送某些消息。关于这一点的文档是MSDN,我似乎不掌握如何在Perl中应用它

有谁能推荐Perl中正确的调用语法吗

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

使用严格;
使用警告;
使用5.014;
使用Win32::Console;
使用Win32::GUI();
使用自动模具;
使用警告qw;
经常使用;
使用Win32API::File::Time qw{:win};
使用Image::ExifTool qw(:Public);
使用Date::Parse;
# ...
我的($FileName,$ImageDir,$DIR,$TopDir);
# ...
$TopDir='D:\My Documents';
$ImageDir=Win32::GUI::BrowseForFolder(-root=>$TopDir,-includefiles=>1,);
除非($ImageDir){
说“$DirName在调用Win32::GUI::BrowseForFolder后未定义,”,
“照片日期设置行”。\uuuu行\uuuuu;
出口
}
否则{
说“已识别目录:$ImageDir”;
}    
#现在选择一个文件
$FileName=Win32::GUI::GetOpenFileName(-title=>'选择一个图像文件',-directory=>$ImageDir,
-文件=>“\0”“x 256”,
-过滤器=>[“图像文件(*.jpg)”=>“*.jpg;*.jpeg”,“所有文件”,“***”,],);
除非($FileName){
说“$FileName在调用Win32::GUI::GetOpenFileName后未定义,”,
“照片日期设置行”。\uuuu行\uuuuu;
}
否则{
说“已识别图像文件:$FileName”;
}
# ...

注意:(有点)类似的帖子:

不幸的是,
Win32::GUI
API既不公开启用钩子的标志位
,也不公开
GetOpenFileName
选项的
lpfnHook
字段


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

谢谢您,Borodin。这和它有联系吗这会有帮助吗?:@Helen:这是有关系的,但它是用来把钩子挂在你可以接触到其把手的窗户上的。调用
GetOpenFileName
时,将创建一个对话框,由用户操作,并再次关闭,然后将控件返回给调用程序,其中包含有关所选文件的信息。因此,当对话框出现时,主程序没有运行,并且无法获取和使用窗口句柄。这就是为什么您需要指定一个回调,该回调将发送
WM_INITDIALOG
消息,说明对话框即将显示,并允许它进行任何最终调整
 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";
    }
# ...