0

Windowsアプリに、チャットセッションのユーザーを一覧表示するリストボックスがあります。これは次のように定義されます。

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

文字列を追加した後、LB_SETITEMDATAを使用してアイテムデータを設定する必要があります。データは単なるポインタサイズの値であるため、アイテムがリストに存在する限り、各$user_data構造体はメモリに存在する必要があります...

于 2012-06-12T00:36:50.893 に答える
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 に答える