2

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

您需要在 C# 应用程序中做些什么来让它意识到这些字符串在其列表中,因此应该反映在 Items.Count 中,并且可以使用 Items[x] 进行访问?

4

1 回答 1

2

创建一个ListBox覆盖的子类WndProc,监听LB_ADDSTRING消息(值 = 0x180),防止这些消息被正常处理,而是将它们包含的数据添加到Items集合中。尚未测试此代码,但它应该足够接近您的需要:

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 回答