BrowseForFolder()窗口无法在前台打开,隐藏(Perl Win32 :: GUI)

时间:2012-09-22 07:35:08

标签: windows perl winapi

当调用Perl Win32::GUI::BrowseForFolder()时,桌面(自然地)上面有几个早期的窗口。事实证明,BrowseForFolder()窗口隐藏在这些窗口后面。这有时令人困惑和恼人,因为您可能没有意识到程序要求您提供文件夹名称,并且您可能认为存在错误。 (这与(例如)Win32::GUI::GetOpenFileName()GetSaveFileName()不同,后者会在前台弹出!)。

我的问题是:如何让BrowseForFolder()走到前台?

一种可能性是找到它的句柄,然后将其提升到前台。

请注意-addexstyle => WS_EX_TOPMOST没有效果(见下文)。

这是一个完整的(可编译的和正在运行的)代码示例。 (5.014不是必需的)

use strict;

use warnings;
use 5.014;      
use Win32::GUI();
use Win32::GUI qw{ WS_EX_TOPMOST};
my ($InputDir, $TopDir, $InputFileName, $dw, $dh, $desktop, $Window);

$TopDir = 'D:\My documents';    # Change this to an existing direcotry of yours
$desktop = Win32::GUI::GetDesktopWindow();
$dw = Win32::GUI::Width($desktop);
$dh = Win32::GUI::Height($desktop);
$Window = Win32::GUI::Window->new( -name => 'main', -text => 'Main window',
    -pos => [20/100*$dw, 20/100*$dh], -size => [50/100*$dw, 60/100*$dh],
    -onTerminate => \&TerminateWindow,
    -addexstyle => WS_EX_TOPMOST,   -dialogui => 1, -tabstop => 1, -cancel => 1, );
$Window -> AddButton ( -name => 'ButtonCommit', -pos => [10,10], 
    -size =>[16/100*$dw,3.5/100*$dh], -text => 'Commit changes', -onClick => \&Commit);
sub Commit {
$InputDir = Win32::GUI::BrowseForFolder( -root => $TopDir, -includefiles => 1,
                -title => 'Select directory for parameter file', 
                -text =>'Selext directory for parameter file',
                -size => [50/100*$dw, 50/100*$dh], -addexstyle => WS_EX_TOPMOST,);
$InputFileName = Win32::GUI::GetOpenFileName( -title  => 'Select the input file',
    -directory => $InputDir, -file   => "\0" . " " x 256,
    -filter => ["Text files (*.txt)" => "*.txt", "All files", "*.*", ],
    -text => 'text Select input file');
} # end sub Commit
$Window ->Show();
Win32::GUI::Dialog();
sub TerminateWindow {
return -1;
}

单击“提交更改”按钮,然后最小化主窗口,然后才能看到“隐藏”BrowseForFolder()窗口。

请注意,BrowseForFolder()窗口隐藏在其他窗口后面,您需要最小化其他窗口才能访问它。所有其他Perl Win32::GUI窗口都在前台打开。

此外,请注意-addexstyle => WS_EX_TOPMOST没有效果,而通常在Perl Win32::GUI窗口中有效。

注意:将D:\My documents更改为现有目录。

相关问题:如何找到桌面窗口句柄?如果我们能找到BrowseForFolder()的句柄,我们就可以把它提升到前台。

(注意:在PerlMonks交叉发布的类似问题:http://perlmonks.org/?node_id=994815

1 个答案:

答案 0 :(得分:3)

如果删除

-addexstyle  => WS_EX_TOPMOST,

从主窗口(以及浏览器),它跳转到前台。该标志用于应该在顶部的窗口,无论是什么 - 通常是一些小部件。