2

AC# WinForms アプリには、フォームに ListBox があります。ListBox ウィンドウ ハンドルは、SendMessage(hWnd,LB_ADDSTRING...) を使用してリスト ボックスに項目を追加するレガシ Win32 DLL に渡されます。これらの文字列は実行時にリストボックスに表示されますが、listbox.Items.Count は 0 であり、listbox.Items[x].ToString() を使用して個々の項目にアクセスすることはできません。

これらの文字列がリストに含まれているため、Items.Count に反映され、Items[x] を使用してアクセス可能であることを C# アプリに認識させるには、C# アプリで何をする必要がありますか?

4

1 に答える 1

2

ListBox、 overrideのサブクラスを作成し、メッセージ (値 = 0x180) をWndProcリッスンし、それらのメッセージが正常に処理されないようにし、代わりにメッセージに含まれるデータをコレクションに追加します。このコードをテストしていませんが、必要なものに十分近いはずです:LB_ADDSTRINGItems

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class LegacyListBox : ListBox
{
    private const int LB_ADDSTRING = 0x180;

    public LegacyListBox() { }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == LB_ADDSTRING)
        {
            Items.Add(Marshal.PtrToStringUni(m.LParam));

            // prevent base class from handling this message
            return;
        }

        base.WndProc(ref m);
    }
}
于 2012-10-21T21:48:05.393 に答える