我在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。我做错了什么?
答案 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.