0

我在 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 结构将包含第一项的详细信息,但它实际上是 undef 并且我也没有得到任何 LB_ERR。我究竟做错了什么?

4

2 回答 2

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.
于 2012-06-12T04:02:30.083 回答
1

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

于 2012-06-12T00:36:50.893 回答