C# TreeView,TVM_DELETEITEM,HTREEITEM,SendMesage-如何在C中开发它?

C# TreeView,TVM_DELETEITEM,HTREEITEM,SendMesage-如何在C中开发它?,c#,winapi,treeview,C#,Winapi,Treeview,我需要一些关于这个主题的帮助: 我有一个树状视图的句柄,比如说十个项目,我想删除第三个树状视图项目 但我必须用C语言和WinApi来实现这一点 我要说的是: [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam); private const int TV_FIRST = 0x1100; private const i

我需要一些关于这个主题的帮助:

我有一个树状视图的句柄,比如说十个项目,我想删除第三个树状视图项目

但我必须用C语言和WinApi来实现这一点

我要说的是:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam);

private const int TV_FIRST = 0x1100;
private const int TVM_DELETEITEM = TV_FIRST + 1;

private void xx(...)
{
   /* "treeHwnd" is the hwnd to the TreeView (and not to the TreeView containig window)
       "itemHwnd" thats the problem! See below
   */
   var treeHwnd = ...
   var itemHwnd = 3; // NOTE, that here is the ITEM NUMBER assigned that should be deleted!
   DeleteTreeViewItem((IntPtr) treeHwnd, (IntPtr) itemHwnd);
}
我知道这个很好的链接:

并了解itemHwnd不是应删除的项目编号。 它是指向结构的指针。。。好啊但是如何用C语言编写呢

我的尝试无效SendMessage返回值为0表示为false:

[Serializable]
public struct _TreeItem
{ 
  // EMPTY! because next line of code is commented ...  
  // public IntPtr Number; 
}

private static unsafe bool DeleteTreeViewItem(IntPtr hwnd, IntPtr item)
{
    var rc = new _TreeItem();
    unsafe
    {
      *(IntPtr*)&rc = item;
    }
    var success = SendMessage(hwnd, TVM_DELETEITEM, (IntPtr)0, *(IntPtr*)&item) == 1;
    return success;
}
是的,我知道有些不安全信息是多余的,SendMessage也可以写为

SendMessage(hwnd, TVM_DELETEITEM, (IntPtr)0, *&item)
。。。正如我所说的,我结巴了任何帮助都会很好


提前谢谢

不起作用没有多大用处。也就是说,你离解决这个问题还有很长的路要走。您必须使用TVM_GETNEXTITEM消息获取HTREEITEM。你需要停止疯狂的猜测和尝试错误。用任意指针代码编写不安全的块不会有任何效果。如果你不懂指针,不要试图弥补它。你必须先了解他们。然而,您根本不需要理解这里的指针。因此,请删除所有不安全的代码。最后,你为什么不用自动化来做呢?@HansPassant我认为这里不需要任何指针。只是一个简单的项目。当然,当另一个应用程序删除了它的树视图节点时,它将做什么,这是任何人都能猜到的。即使UI自动化也能做到这一点。@David Heffernan,谢谢你的提示。我解决了!缺少的链接是,我必须浏览这些项目。从TVG_根开始,然后是TVGN_。每个调用都将下一个树状视图项作为HTREEITEM指针的typeof返回。用这个指针我可以删除这些项目。。。