From: <gw...@se...> - 2005-10-07 07:47:37
|
Coincidentally, I've been working on a similar problem and was very interested to read this. My latest project involves using threads to perform lengthy tasks, but showing a progress bar with a 'Cancel' button on the main (or child) window. The problem is that the sharing of blessed variables is not yet supported in threads::shared, so you have to share the handle and use the Win32::GUI::Show($win) syntax. That's OK for one window, but it gets old and ugly when you want to access many controls on the window. Hence, I would also be interested to hear of a way to convert a handle into a Win32::GUI object. Are there any other uses for this? Is it worth adding as a feature request? Glenn Munroe ------------------- reply --------------- > From: jez...@ho... > To: pka...@pi..., per...@li... > Subject: RE: [perl-win32-gui-users] Attaching to a window created by some other application > Date: 2005-10-06 11:16:59 > ---------------------------------- > Hummm replying to my own post:) > > >>windows it manipulates. Is it possible to attach to a window/control > >>created by some other application? Say I have a handle of a main window of > >>Windows calculator. How do I turn it into Win::GUI object? > > > >Interesting question. As a quick/dirty answer, yes it could be possible. > >The basic problem is that when Win::GUI object's are destroyed the > >underlying window handle is also "destroyed".This could be solved by having > >some sort of flag to say if Win::GUI actually owns the object or not. > > Ok - the above is true when we're using objects via method calls but most of > the internals can also be called as functions. For example: > > $win->Show(); #shows the window > > but we could also call it this way: > > Win32::GUI::Show($win); > > Where $win is a Win32::GUI object OR the handle...So, if you've got a handle > for some other app, then it should just work... > > Hope that makes some sense. > > Cheers, > > jez. > > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: > Power Architecture Resource Center: Free content, downloads, discussions, > and more. http://solutions.newsforge.com/ibmarch.tmpl > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > http://perl-win32-gui.sourceforge.net/ > |
From: Jeremy W. <jez...@ho...> - 2005-10-07 08:31:42
|
>Coincidentally, I've been working on a similar problem and was very >interested >to read this. My latest project involves using threads to perform lengthy >tasks, >but showing a progress bar with a 'Cancel' button on the main (or child) >window. >The problem is that the sharing of blessed variables is not yet supported >in >threads::shared, so you have to share the handle and use the >Win32::GUI::Show($win) syntax. That's OK for one window, but it gets old >and >ugly when you want to access many controls on the window. Hence, I would >also be >interested to hear of a way to convert a handle into a Win32::GUI object. >Are >there any other uses for this? Is it worth adding as a feature request? I must admit, I've thought the same thing (and for almost the same reason) - which is why when I first replied I was talking about objects rather than static function calls. From a technical perspective - and I admit I've only spent a couple of minutes looking in to this- it should be possible to have a generic CreateFromHandle constructor that could be used to create most Win32::GUI objects (such as DC, Window ect). The first issue that would have to be resolved is ownership of the underlying windows handle, as when a Win32::GUI object goes out of scope the window handle is destroyed. A more significant issue is that some of the more complicated objects (such as window) have various structures associated with them when they were built via Win32::GUI - I suspect that many of these structures couldn't be filled via CreateFromHandle, meaning some functionality might me lost. For example: my $win=Win32::GUI::Window::CreateFromHandle($handle); $win->Show; #no problem $win->Hide; #no problem $win->SomeControl->Show(); #how would we know a control called 'SomeContol' exists? I can think some work arounds for the above - especially if the window was created by Win32-GUI in another thread, which brings me to the issue of thread ownership of controls/windows - but the guitest guys know all about that:) Cheers, jez. |
From: Robert M. <rm...@po...> - 2005-10-07 10:10:32
|
Jeremy White wrote: >> Coincidentally, I've been working on a similar problem and was very >> interested > > For example: > > my $win=Win32::GUI::Window::CreateFromHandle($handle); > $win->Show; #no problem > $win->Hide; #no problem > $win->SomeControl->Show(); #how would we know a control called > 'SomeContol' exists? A control called 'SomeControl' doesn't exist if this is window created outside Win32::GUI. Navigating the window tree can't be done like this. You could already do something like this (untested): my $win = { -handle => 1234 }; bless $win, "Win32::GUI::Window"; # or other appropriate class $win->Move( ... ) etc. You'll need to make sure the you do $win->{-handle} = undef; Before $win goes out of scope, to avoid calling the destructor; although if you're in a different thread to the one that created the window the DestroyWindow docs say 'A thread cannot use DestroyWindow to destroy a window created by a different thread' - but don't say what happens if you try. Regards, Rob. |