Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^3: Win32::GUI: how to find BrowseForFolder()'s handle?

by Anonymous Monk
on Sep 21, 2012 at 22:28 UTC ( [id://995000]=note: print w/replies, xml ) Need Help??


in reply to Re^2: Win32::GUI: how to find BrowseForFolder()'s handle?
in thread Win32::GUI: how to find BrowseForFolder()'s handle?

Not correct.

How do you know?

Like I said in the OP, GetOpenFileName() and GetSaveFileName(), for example, pop up and show at the foreground, on top of all other existing windows. So why should BrowseForFolder() be different? It's the same type of window/interaction.

It isn't. Neither one will pop up if they (the parent, the app) don't have focus (aka permission ) to pop up -- they simply flash on the taskbar

Not correct. That code compiles fine.

Oh really?

$ perl $InputDir = Win32::GUI::BrowseForFolder( -root => $TopDir, -includefil +es => 1, -title => 'Select directory fo +r parameter file', -text =>'text Selext directory + for parameter file', -size => [50/100*$dw, 50/100*$ +dh], -addexstyle => WS_EX_TOPMOST,); ^Z Undefined subroutine &Win32::GUI::BrowseForFolder called at - line 1.

Really?

use Win32::GUI; use warnings; $InputDir = Win32::GUI::BrowseForFolder( -root => $TopDir, -includefil +es => 1, -title => 'Select directory fo +r parameter file', -text =>'text Selext directory + for parameter file', -size => [50/100*$dw, 50/100*$ +dh], -addexstyle => WS_EX_TOPMOST,); __END__ Name "main::dh" used only once: possible typo at - line 6. Name "main::InputDir" used only once: possible typo at - line 3. Name "main::dw" used only once: possible typo at - line 6. Name "main::TopDir" used only once: possible typo at - line 3. Use of uninitialized value $dw in multiplication (*) at - line 3. Use of uninitialized value $dh in multiplication (*) at - line 3. Use of uninitialized value in subroutine entry at - line 3.

How do I post a question effectively? , Basic debugging checklist , How (Not) To Ask A Question

Replies are listed 'Best First'.
Re^4: Win32::GUI: how to find BrowseForFolder()'s handle?
by HelenCr (Monk) on Sep 22, 2012 at 06:58 UTC

    The code piece was just a code snippet, to illustrate the problem. Obviously in the OP it was not intended as a complete program. (See new code example below).

    To recall the two problems:

    1. The "BrowseForFolder()" window does not show up at the foreground, while all other windows do. This is disturbing and annoying, and can lead to many problems.

    Here is a complete (compileable and running) code example. (5.014 is not essential)

    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 win +dow', -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', -onCl +ick => \&Commit); sub Commit { $InputDir = Win32::GUI::BrowseForFolder( -root => $TopDir, -includefil +es => 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 i +nput 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; }

    Click the "Commit changes" button, then minimize the main window. Note that the "BrowseForFolder()" window hides behind other windows, and you need to minimize other windows to get to it. All other Perl Win32::GUI windows do open up at the foreground. Furthermore, note that -addexstyle => WS_EX_TOPMOST doesn't have an effect, while it usually does in Perl Win32::GUI windows.

    Note: change the 'D:\My documents' to an existing directory of yours.

    2. How does one find the desktop windows handles? If we could find BrowseForFolder()'s handle, we could raise it to the foreground (how?)

    Many TIA

    Helen

      First some notes SSCCE (its like noise )

      Here is a complete (compileable and running) code example.

      Thanks. I see what you're talking about now. You can fix this by removing

      -addexstyle => WS_EX_TOPMOST,
      from $window/Main Window

      :D

      That may or may not be what you want, but its a fix ;D

      2. How does one find the desktop windows handles? If we could find BrowseForFolder()'s handle, we could raise it to the foreground (how?)

      If you wonder how it works, UTSL http://cpansearch.perl.org/src/ROBERTMAY/Win32-GUI-1.06/GUI.xs

      Would you look at that # -owner => WINDOW

      Yup, specifying   -owner => $Window, does the trick (it works), no WS_EX_TOPMOST required

        Thank you. That was instructive, and it actually solves the issue.

        (SSCCE and UTSL are instructive too - learned something new).

        A follow-up question: the role of the "-owner" option is not clear to me. Why and when is it necessary, and why does it fix the problem?

        TIA Helen

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://995000]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2024-03-28 21:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found