Hey everyone,

 

Here is an alternative method for extracting a structure out of a wParam or 
lParam parameter. I pieced this together from various posts on the mailing 
list. This method is message specific and requires knowledge of the size and 
members of the specific structure. This example uses the WM_HELP message, which 
is sent when a user click the '?' button in the top-right corner:

 

$win->Hook(WM_HELP, sub {
  my ($this, $wParam, $lParam, $type, $msgcode) = @_;
  return unless $type == 0;
  return unless $msgcode == WM_HELP;
  my %helpinfo;
  #Here's how to get a stucture when only given a memory address:
  # 1. Pack the $lParam arg into a Long using pack "L" This turns the number 
into a usable memory address
  # 2. Unpack the result into a string using the size of the structure in bytes 
using unpack "P28"
  # 3. Unpack the result using the typedef for the structure and the 
appropriate pack formats
  @helpinfo{qw(cbSize iContextType iCtrlId hItemHandle dwContextId X Y)} = 
unpack("IiiLLll", unpack("P28", pack("L", $lParam)));
  #The internal Win32::GUI::GetWindowObject can get a window object from its 
handle
  my $control = Win32::GUI::GetWindowObject($helpinfo{hItemHandle});
  #process message...
  return 1;
 });

 

Remember, that if the structure contains any structures as parameters, they 
have to unpacked as well. For example, the X and Y above is part of a POINT 
structure.

 

Refer to the Windows SDK documentation for information about the various 
messages and structures.

 

Hope this helps.

 

Kevin.
 


Date: Sat, 18 Jul 2009 01:17:40 +0000
From: l...@weisberg.com
To: perl-win32-gui-users@lists.sourceforge.net
Subject: Re: [perl-win32-gui-users] Interpreting an lParam pointer

perl-win32-gui-users list,

I wrote:
> But how do I find and read the [COPYDATASTRUCT] structure pointed 
>    to by the integer $lParam ?

Well, I figured it out.
Here's a sub, not completely general, but handles the case
of a scalar message string.

Thanks for your indulgence.
(Maybe this will be useful for someone else searching the list archive.)

Cheers,
-Len

use Tie::Array::Pointer ;

sub read_COPYDATASTRUCT {
   ## input: $CopyData_p   (eg from an lParam)
   ## output (scalar): $Msg    (list): ($Msg, dwData_p)
   my $CopyData_p = shift ;

   my @CopyData_a ;
   tie @CopyData_a, 'Tie::Array::Pointer',
      {length => 3,    type   => 'L',    address => $CopyData_p } ;
   my ($dwData_p, $cbData_len, $lpData_p) = @CopyData_a ;

   my @Msg_a ;
   tie @Msg_a, 'Tie::Array::Pointer',
      {length => $cbData_len,  type   => 'C',  address => $lpData_p } ;

   pop @Msg_a if @Msg_a[-1] eq "\0" ;    ## pop off trailing null   (more??)
   my $Msg = pack "C$#Msg_a", @Msg_a ;
   wantarray ? ($Msg, $dwData_p)  : $Msg ;
}




On Jul 17, 2009, l...@weisberg.com wrote:


I am trying to use Win32::GUI from a Perl/Tk program
to receive and interpret a message sent from another window.

I have successfully set up a window to receive and a hook to
   handle the message.
   Using the example in Win32::GUI::Reference/Methods.pod, I have

 sub msg_handler {
    ($object, $wParam, $lParam, $type, $msgcode) = @_;
    print "Click handler called!\n";
 }

The result looks reasonable in the debugger, 
and $lParam is supposed to be a pointer to a WM_COPYDATA structure.

But how do I find and read the structure pointed to by the integer $lParam ?
I have a hunch that Win32::API::Struct could help, but I don't quite see how.

Thanks,
-Len

_________________________________________________________________
What goes online, stays online Check the daily blob for the latest on what's 
happening around the web
http://windowslive.ninemsn.com.au/blog.aspx
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Perl-Win32-GUI-Users mailing list
Perl-Win32-GUI-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
http://perl-win32-gui.sourceforge.net/

Reply via email to