使用lb#U addstring添加到c#列表框中的项目不会影响items.count

使用lb#U addstring添加到c#列表框中的项目不会影响items.count,c#,listbox,C#,Listbox,C#WinForms应用程序的表单上有一个列表框。ListBox窗口句柄被传递到一个旧的Win32 DLL,该DLL使用SendMessage(hWnd、LB_ADDSTRING…)将项目添加到列表框中。这些字符串在运行时出现在listbox中,但是listbox.Items.Count为0,不能使用listbox.Items[x].ToString()访问单个项目 你需要在C#app中做什么才能让它意识到那些字符串在它的列表中,因此应该反映在条目中。计数,以及使用条目[x]访问?创建列表框的子

C#WinForms应用程序的表单上有一个列表框。ListBox窗口句柄被传递到一个旧的Win32 DLL,该DLL使用SendMessage(hWnd、LB_ADDSTRING…)将项目添加到列表框中。这些字符串在运行时出现在listbox中,但是listbox.Items.Count为0,不能使用listbox.Items[x].ToString()访问单个项目


你需要在C#app中做什么才能让它意识到那些字符串在它的列表中,因此应该反映在条目中。计数,以及使用条目[x]访问?

创建
列表框的子类
,重写
WndProc
,监听
LB#U ADDSTRING
消息(值=0x180),阻止正常处理这些消息,而是将它们包含的数据添加到
集合中。尚未测试此代码,但它应该足够接近您需要的:

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);
    }
}

为什么要这样添加项目。您可能知道正确的方法是调用listbox.Items.Add(string);