C#下用API跨进程控制别的窗体的TreeView

简介:
using System.Text;
using System;
using System.Runtime.InteropServices;
class API
{
    #region   "API函数定义 "
    [DllImport("user32.dll ", CharSet = CharSet.Unicode)]
    private static extern int SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lparam);
    [DllImport("user32.dll ", CharSet = CharSet.Unicode)]
    private static extern int SendMessage(int hWnd, int msg, IntPtr wParam, TVITEM lparam);
    [DllImport("user32.dll ")]
    public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
    [DllImport("user32.dll ")]
    public static extern int EnumChildWindows(int hWndParent, MyCallBack lpfn, StringBuilder value);
    [DllImport("user32.dll ")]
    public static extern int GetClassNameA(int hwnd, StringBuilder lpClassName, int nMaxCount);
    [DllImport("kernel32 ", CharSet = CharSet.Unicode)]
    public static extern int CopyMemory(StringBuilder Destination, IntPtr Source, int Length);
    [DllImport("kernel32 ", CharSet = CharSet.Unicode)]
    public static extern int GlobalAlloc(int wFlags, int dwBytes);
    [DllImport("kernel32 ", CharSet = CharSet.Unicode)]
    public static extern int GlobalFree(IntPtr hMem);
    #endregion

    #region   "常量定义 "
    private const int TVGN_CARET = 0x00000009;
    private const int TVM_SELECTITEM = 0x0000110b;
    private const int TVGN_ROOT = 0x00000000;
    private const int TVM_GETNEXTITEM = 0x0000110a;
    private const int TVIF_TEXT = 0x0001;
    private const int TVGN_NEXT = 0x00000001;
    private const int TVM_GETITEM = 0x0000110c;
    private const int TVGN_CHILD = 0x00000004;
    private const int GMEM_FIXED = 0x0000;
    #endregion
    ///   <summary> 
    ///   选取TreeView指定项 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <param   name= "ItemHwnd "> 节点对象句柄 </param> 
    ///   <returns> 成功选中返回true   没找到返回false </returns> 
    public static bool SelectNode(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
    {
        int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_SELECTITEM, new IntPtr(TVGN_CARET), ItemHwnd);
        if (result == 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    ///   <summary> 
    ///   获取TreeView根节点 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <returns> 成功返回根节点句柄   否则返回   0 </returns> 
    public static IntPtr GetRoot(IntPtr TreeViewHwnd)
    {
        TVITEM tv = new TVITEM();
        IntPtr hStr = Marshal.AllocHGlobal(1024);
        tv.hItem = TreeViewHwnd;
        tv.mask = TVIF_TEXT;
        tv.pszText = hStr;
        tv.cchTextMax = 1024;
        int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_ROOT), tv);
        Marshal.FreeHGlobal(hStr);
        return new IntPtr(result);
    }
    ///   <summary> 
    ///   获取同级下一节点句柄 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <param   name= "PrevHwnd "> 上一项节点句柄 </param> 
    ///   <returns> 成功返回下一项节点句柄   否则返回   0 </returns> 
    public static IntPtr GetNextItem(IntPtr TreeViewHwnd, IntPtr PrevHwnd)
    {
        int mbHwnd = 0;
        mbHwnd = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_NEXT), PrevHwnd);
        return new IntPtr(mbHwnd);
    }
    ///   <summary> 
    ///   获取第一个子节点句柄 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <param   name= "ParentHwnd "> 父节点句柄 </param> 
    ///   <returns> 成功返回第一个子节点句柄   否则返回   0 </returns> 
    public static IntPtr GetFirstChildItem(IntPtr TreeViewHwnd, IntPtr ParentHwnd)
    {
        int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_CHILD), ParentHwnd);
        return new IntPtr(result);
    }
    ///   <summary> 
    ///   获取指定项文本 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <param   name= "ItemHwnd "> 节点句柄 </param> 
    ///   <returns> </returns> 
    public static string GetItemText(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
    {
        StringBuilder sb = new StringBuilder(1024);
        int hStr = GlobalAlloc(GMEM_FIXED, 1024);
        if (hStr > 0)
        {
            TVITEM tv = new TVITEM();
            tv.mask = TVIF_TEXT;
            tv.HTreeItem = ItemHwnd.ToInt32();
            tv.pszText = new IntPtr(hStr);
            tv.cchTextMax = 1023;
            int i = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETITEM, IntPtr.Zero, tv);
            int iCopy = CopyMemory(sb, new IntPtr(hStr), 1024);
            GlobalFree(new IntPtr(hStr));
        }
        return sb.ToString();
    }
}
///   <summary> 
///   TV_ITEM结构 
///   </summary> 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class TVITEM
{
    public int mask;
    public IntPtr hItem;
    public int state;
    public int stateMask;
    public IntPtr pszText;
    public int cchTextMax;
    public int iImage;
    public int iSelectedImage;
    public int cChildren;
    public IntPtr lParam;
    public int HTreeItem;
}

下面是补充上面的取节点文本的
复制 保存
///   <summary> 
///   获取指定项文本 
///   </summary> 
///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
///   <param   name= "ItemHwnd "> 节点句柄 </param> 
///   <returns> </returns> 
public static string GetItemText(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
{
    IntPtr hStr = Marshal.AllocHGlobal(1024);
    TVITEM tv = new TVITEM();
    tv.hItem = ItemHwnd;
    tv.mask = TVIF_TEXT;
    tv.pszText = hStr;
    tv.cchTextMax = 1024;
    StringBuilder sb = new StringBuilder(1024);
    int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETITEM, new IntPtr(0), tv);
    int iCopy = CopyMemory(sb, hStr, 1024);
    Marshal.FreeHGlobal(hStr);
    return sb.ToString();
}本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2009/09/07/1561808.html,如需转载请自行联系原作者
 

相关文章
|
4月前
|
C# 数据库
40.c#:TreeView 控件
40.c#:TreeView 控件
48 1
|
4月前
|
Java 数据库 C#
C#winforms实现windows窗体人脸识别
C#winforms实现windows窗体人脸识别
|
1月前
|
开发框架 人工智能 自然语言处理
基于ChatGPT的API的C#接入研究
基于ChatGPT的API的C#接入研究
|
2月前
|
C#
C#进程调用FFmpeg操作音视频
因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作。本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并、音频合并、音频与视频合并成视频这几个简单的音视频操作。
|
2月前
|
开发框架 数据可视化 C#
|
4月前
|
JSON API C#
C# 通过阿里云 API 实现企业工商数据查询
C# 通过阿里云 API 实现企业工商数据查询
|
4月前
|
SQL 存储 C#
C# Web控件与数据感应之 TreeView 类
C# Web控件与数据感应之 TreeView 类
|
4月前
|
JSON 文字识别 算法
C# 通过阿里云 API 实现企业营业执照OCR识别
C# 通过阿里云 API 实现企业营业执照OCR识别
|
4月前
|
C#
C#如何实现窗体最小化到托盘
C#如何实现窗体最小化到托盘
42 0