User32.dll的SendMessage方法返回错误的ListViewGroup ID

时间:2013-04-23 22:38:09

标签: c# winforms user32

我想处理群组标题点击事件。我使用this post中的信息来实现我的目标。应用程序正确识别鼠标单击组头,问题实际上是,如标题所述,SendMessage方法返回的组ID对于某些组是错误的。

我的ListView(我在其上测试了代码)看起来像这样:

Group 1
  Item 1.1
  Item 1.2
Group 2
  Item 2.1
  Item 2.2
Group 3
  Item 3.1

基本上,它一直正常,直到我点击第2组或第3组。单击组标题时SendMethod将返回以下值:Group 1为0,Group 2为2,Group 3为3。

这里是WndProc方法实现:

protected override void WndProc(ref Message m)
    {
        bool passMessage = true;

        if (m.Msg == WM_RBUTTONDOWN)
        {
            Point hitPoint = LParamToPoint(m.LParam);
            LVHITTESTINFO lvHitTestInfo = new LVHITTESTINFO();
            lvHitTestInfo.pt.x = hitPoint.X;
            lvHitTestInfo.pt.y = hitPoint.Y;

            int rtn = SendMessage(listView.Handle, LVM_SUBITEMHITTEST, -1, ref lvHitTestInfo);
            if (rtn != -1)
            {
                if (((lvHitTestInfo.flags & LVHITTESTFLAGS.LVHT_EX_GROUP_HEADER) == LVHITTESTFLAGS.LVHT_EX_GROUP_HEADER))
                {
                    passMessage = false;

                    string groupName;
                    if (rtn == listView.Groups.Count)
                        groupName = "default";
                    else
                        groupName = listView.Groups[rtn].Header;
                    GroupClicked.Invoke(listView, new ListViewInterceptorEventArgs(rtn, groupName));
                }
            }
        }

        if (passMessage)
            base.WndProc(ref m);
    }

我想显示与所选组相关的内容,因此我需要知道点击了哪一个。我使用Windows 8.如果有人可以指导我找到解决方案,我会非常感激。如果您需要任何其他信息,请告诉我,我会为您提供。

P.S。在我的应用程序中,我动态添加组,如下所示:

                ListViewGroup contactsGroup = new ListViewGroup(group.id, group.name);
                contactsGroup.Name = group.id;
                contactsGroup.HeaderAlignment = HorizontalAlignment.Center;
                lvContacts.Groups.Add(contactsGroup);
                for (int i = 0; i < group.users.Count; i++)
                {
                    ListViewItem lvi = new ListViewItem(group.users[i]);
                    lvi.SubItems.Add(group.userStatus[i] ? "ONLINE" : "offline");
                    lvi.Group = contactsGroup;
                    lvContacts.Items.Add(lvi);
                }

同样的WndProc方法实现在另一个程序中运行得很好,我只是为了测试它而编写的,我在其中通过设计器添加了组。

1 个答案:

答案 0 :(得分:0)

2019年6月:这仍然是Microsoft显然尚未解决的问题!

但是感谢 David Amey ,我们解决了问题。 您首先需要创建所有组并将其添加到列表视图

Dim MyLvg As ListViewGroup = New ListViewGroup With {.Header = "MyGroup1", .Name = "MyGroup1"}
MyLsv.Groups.Add(MyLvg)

只有在此之后,您才能添加项目。


发现,在这个阶段,如果您从头开始声明一个新的ListViewItem并添加它,将无法正常工作,但是在这里,您需要遍历现有的ListView实例创建它。然后只需将您的Lvi链接到您的Lsv就可以了。

Dim MyLvi As ListViewItem = MyLsv.Items.Add("This is my new item")
MyLvi.Group = MyLvg

最后一点,让我补充一点,我已经测试了将ListViewItems链接到ListViewGroups的6种方法,并且都可以正常工作

MyLvi.Group = MyLvg
MyLvi.Group = MyLsv.Groups(0)
MyLvi.Group = MyLsv.Groups("MyGroup1")

MyLvg.Items.Add(MyLvi)
MyLsv.Groups(0).Items.Add(MyLvi)
MyLsv.Groups("MyGroup1").Items.Add(MyLvi)

这似乎合乎逻辑,但是我们仍然没有得到这些错误,所以我宁愿仔细检查。

使用这种创建和链接组和项目的方式一定可以确保您避免LVHITTESTINFO出现的“ Bad Group Id”问题。