为返回Struct的ListBox调用Win32 :: API SendMessage

时间:2012-06-12 00:30:32

标签: perl winapi sendmessage

我在Windows应用中有一个ListBox,用于列出聊天会话中的人物。其定义如下:

Win32::API::Struct->typedef('UserItem', qw {
                                                USHORT uid;
                                                TCHAR realName[256];
                                                TCHAR aliasName[256];
                                            }
                       ) or die "Typedef error $! \n";

my $user_data = Win32::API::Struct->new('UserItem');

现在我想向窗口发送LB_GETITEMDATA消息,以获取结构定义的与会者项目详细信息。

使用Win32 :: API,我这样做:

my $LB_GETITEMDATA = 0x0199;
my $SendMessage = Win32::API->new("user32", "SendMessage", "NNNN", "S");
... # Here is the code to find the window handle, which is $hwnd.
$user_data = $SendMessage->Call($hwnd, $LB_GETITEMDATA, 0, 0); # Get the first item.

现在,我认为$ user_data struct将包含第一项的详细信息,但它实际上是undef&我也没有得到任何LB_ERR。我做错了什么?

2 个答案:

答案 0 :(得分:1)

添加字符串后,必须使用LB_SETITEMDATA设置项目数据。数据只是一个指针大小的值,因此每个$ user_data结构必须存在于内存中,只要该项存在于列表中...

答案 1 :(得分:1)

这对我没有任何意义。如果你不告诉它,Win32 :: API如何知道SendMessage返回什么类型的结构?它不可能从您提供的信息中创建正确类型的对象。

我没有看到如何使用“S”作为返回值。我想如果你想要将值解包到一个:: Struct对象中,你可能必须使用原型接口。这是唯一记录在案的人。

但在开始搞乱之前,请将返回类型更改为“N”,看看是否有指针返回。如果你得到零,它可能是列表框或参数的问题(特别是句柄或消息号,因为“NNNN”看起来对我来说),你应该先修复它。然后,如果仍然存在问题,您可以担心返回值。

如果让:: Struct工作有问题,你可以随时解压缩 自己构建。

 # Use "N" for return.
 my ($uid, $realName, $aliasName) =
    unpack('S Z256 Z256',                # Unpack fields of structure.
       unpack('P514', pack('J', $rv)));  # Get bytes of the structure.