C#操作QQ的TreeView控件

C#实现树状结构图。树状目录。 C#实现目录树状图,完整工程源代码。C#实现目录树状图,完整工程源代码。C#实现目录树状图,完整工程源代码。C#实现目录树状图,完整工程源代码。C#实现目录树状图,完整工程源代码。 立即下载

转载: http://www.cnblogs.com/Rolends/archive/2012/04/23/2467044.html#commentform

image

通过spy++我们可以发现类ATL:30A57F50为treeview控件

我们需实现如下对treeview的操作

1),遍历获取信息 2),单选 3),多选

操作其他进程的步骤这个不区分语言的,一般实现过程如下

1),打开远程进程,这个调用API 函数 OpenProcess来实现

2),分配远程内存,调用API VirtualAllocEx 来实现,当然不是绝对的,当操作是不需要对象,而是通过SendMessage直接返回时就不需要分配

3),内存复制,由本地进程内存复制到远程进程内存,使用WriteProcessMemory来实现,同上不是绝对,只有调用需要读取对象信息时,才有需要

4),发送消息,发送消息就不用说了SendMessage

5),上面发送的消息结果,如果是写入对象的话,那么我们需要读取远程内存到本地和3相反,ReadProcessMemory

6),完了?,没有的.资源没释放,OK,释放资源,一般意义上就完成了

上面所有的步骤在vc里一般都这样实现的

我来讲解一下在C#如何实现操作其他进程的TreeView

1),获取Treeview控件句柄使用API FindWindowEx来实现,下面这个函数是找出所有控件,可以调用之后判断className来获取到控件指针
 public static List<IntPtr> FindControl(IntPtr hwnd, string className, string title = null)
 {
            List<IntPtr> controls = new List<IntPtr>();
            IntPtr handle = IntPtr.Zero;
            while (true)
            {
                IntPtr tmp = handle;
                handle = WinAPIHelper.FindWindowEx(hwnd, tmp, className, title);
                if (handle != IntPtr.Zero)
                {
                    controls.Add(handle);
                }
                else
                    break;
            }
            return controls;
     }

2),读取item

    a),获取根节点

  int retval = WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_GETNEXTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_ROOT, IntPtr.Zero);

,返回值为节点指针

   b),选择获取到的项

 int r1 = WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_SELECTITEM,
                  (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_CARET, new IntPtr(retval));

,返回值为操作结果

   c),展开选中项

 int r2 = WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_EXPAND,
                        (int)WinAPIHelper.TVM_EXPAND.TVE_EXPAND, new IntPtr(retval));

,返回操作结果

   d),声明ITEM并写入远程内存 
 

                    WinAPIHelper.TVITEM tvItem = new WinAPIHelper.TVITEM();
                    int size = Marshal.SizeOf(tvItem);
                    tvItem.mask = WinAPIHelper.TVIF_TEXT;
                    tvItem.hItem = (IntPtr)retval;
                    tvItem.pszText = (IntPtr)(remoteBuffer.ToInt32() + size + 1);
                    tvItem.cchTextMax = 255;
                    localBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(tvItem));
                    Marshal.StructureToPtr(tvItem, localBuffer, false);
                    bSuccess = WinAPIHelper.WriteProcessMemory(hProcess, remoteBuffer, ref tvItem, size, IntPtr.Zero);

关于item定义,大家可查询MSDN

   e),发送获取Item消息

   WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_GETITEM, 0, remoteBuffer);

    f),读取远程内存

   bSuccess = WinAPIHelper.ReadProcessMemory(hProcess, remoteBuffer, localBuffer, buff_size, IntPtr.Zero);

    g),将指针转为结构

WinAPIHelper.TVITEM retItem = (WinAPIHelper.TVITEM)
                                   Marshal.PtrToStructure(localBuffer, (Type)typeof(WinAPIHelper.TVITEM))

经过上面的操作我们就获取到了选定的某一项的信息,接下来我们使用

  retval = WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_GETNEXTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_NEXTVISIBLE, new IntPtr(retval));
来选择下一个项在进行上面的操作,直到返回值为空位置

3),多选实现,多选我们需要通过修改ITEM的状态来实现

  a),声明ITEM(操作为更改状态)

                WinAPIHelper.TVITEM tvItem = new WinAPIHelper.TVITEM();
                tvItem.hItem = items[i].Handle;
                tvItem.mask = WinAPIHelper.TVIF_STATE;
                tvItem.state = WinAPIHelper.TVIS_SELECTED;
                tvItem.stateMask = WinAPIHelper.TVIS_SELECTED;

   b),分配远程内存

IntPtr remoteBuffer = WinAPIHelper.VirtualAllocEx(hPro, IntPtr.Zero, buff_size, WinAPIHelper.AllocationType.Commit, WinAPIHelper.MemoryProtection.ExecuteReadWrite);

   c),写入远程内存

   bool result = WinAPIHelper.WriteProcessMemory(hPro, remoteBuffer, ref tvItem, size, IntPtr.Zero);

   d),设置状态

 int retval = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_SETITEM, 0, remoteBuffer);

  经过上面就实现了为某一项设置选中状态,实际操作中,我们为提高内存使用效率,是先分配缓冲区,在设置(写入)对象,然后发送指令

下面是完整代码

    public class WinTreeViewItem
    {
        public int Index { get; set; }
        public int lpAddress { get; set; }
        public string Text { get; set; }
        public bool OwnChild { get; set; }
        public IntPtr Handle { get; set; }
    }
    public class TreeViewHelper
    {
        const int buff_size = 1024;
        const int MAX_TVMSTRING = 255;        
        static public List<WinTreeViewItem> GetAllItem(IntPtr hTv)
        {
            return GetItems(hTv, null, null, int.MaxValue);
        }
 
        static public WinTreeViewItem GetItemByText(IntPtr hTv, params string[] text)
        {
            List<string> containsList = new List<string>();
            foreach (var item in text)
            {
                if (item != null && item != "")
                    containsList.Add(item);
            }
            List<WinTreeViewItem> items = GetItems(hTv, containsList, null, 1, false);
            if (items.Count > 0)
                return items[0];
            else
                return null;
        }
 
        static public bool SelectItem(IntPtr hTv, WinTreeViewItem item)
        {
            List<WinTreeViewItem> items = new List<WinTreeViewItem>();
            items.Add(item);
            return SelectItems(hTv, items);
        }
 
        static public List<WinTreeViewItem> GetItems(IntPtr hTv, List<string> containsList, List<string> withOutList, int takeCount)
        {
            return GetItems(hTv, containsList, withOutList, takeCount, false);
        }
 
        static public List<WinTreeViewItem> GetItems(IntPtr hTv, List<string> containsList, List<string> withOutList, int takeCount, bool isAddParent, int containsPreferenceCount = 0, int withOutPreferenceCount = 0)
        {
            if (withOutPreferenceCount < 1 && containsPreferenceCount < 1)
            {
                throw new Exception("两个数量级不能同时为空");
            }
            int tryCount = 0;
            IntPtr hPro = WinAPIHelper.OpenProcess(WinAPIHelper.PROCESS_ALL_ACCESS, false, WndHelper.GetProcessId(hTv));
            List<WinTreeViewItem> withOutResultItems = new List<WinTreeViewItem>();
            List<WinTreeViewItem> containsResultItems = new List<WinTreeViewItem>();
            int index = 0;
            int retval = 0;
        GETROOT:
            if (retval == 0)
            {
                tryCount++;
                if (tryCount > SysConfig.TreeViewItemFindTryCount)
                {
                    return null;
                }
                retval = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETNEXTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_ROOT, IntPtr.Zero);
                Console.WriteLine("根节点" + retval);
                Thread.Sleep(500);
                goto GETROOT;
            }
            tryCount = 0;
            int itemCount = 0;
        FINDCOUNT:
            if (itemCount == 0)
            {
                tryCount++;
                if (tryCount > SysConfig.TreeViewItemFindTryCount)
                {
                    return null;
                }
                itemCount = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETCOUNT, 0, IntPtr.Zero);
                Console.WriteLine("可用创建数量" + itemCount);
                Thread.Sleep(500);
                goto FINDCOUNT;
            }
            IntPtr pStrBufferMemory = WinAPIHelper.VirtualAllocEx(hPro, IntPtr.Zero, MAX_TVMSTRING, WinAPIHelper.AllocationType.Commit, WinAPIHelper.MemoryProtection.ReadWrite);
            IntPtr remoteBuffer = WinAPIHelper.VirtualAllocEx(hPro, IntPtr.Zero, Marshal.SizeOf(typeof(WinAPIHelper.TVITEM)), WinAPIHelper.AllocationType.Commit, WinAPIHelper.MemoryProtection.ExecuteReadWrite);
 
            if (remoteBuffer == IntPtr.Zero)
            {
                Console.WriteLine("远程地址分配失败");
                return null;
            }
            if (pStrBufferMemory == IntPtr.Zero)
            {
                Console.WriteLine("远程地址分配失败");
                return null;
            }
            WinAPIHelper.TVITEM tvItem = new WinAPIHelper.TVITEM();
            // int size = Marshal.SizeOf(tvItem);
            tvItem.mask = WinAPIHelper.TVIF_TEXT;
            tvItem.pszText = pStrBufferMemory;
            tvItem.cchTextMax = MAX_TVMSTRING;
            IntPtr localBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(tvItem));
            Marshal.StructureToPtr(tvItem, localBuffer, false);
            int addCount = 0;
            string tmpcontxt = "";
            while (retval != 0)
            {
                if (index + 1 > itemCount) break;
                tvItem.hItem = (IntPtr)retval;
                var item = new WinTreeViewItem()
                {
                    Index = index,
                    lpAddress = retval
                };
                int r1 = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_SELECTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_CARET, new IntPtr(retval));
                if (r1 == 0)
                {
                    Console.WriteLine("选择项失败");
                    continue;
                }
                //Thread.Sleep(100);
                int r2 = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_EXPAND, (int)WinAPIHelper.TVM_EXPAND.TVE_EXPAND, new IntPtr(retval));
                if (r2 == 1)
                {
                    //Console.WriteLine("可以展开");
                    itemCount = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETCOUNT, 0, IntPtr.Zero);
                    item.OwnChild = true;
                }
                else
                {
                    //Console.WriteLine("不可以展开");
                }
                bool bSuccess = WinAPIHelper.WriteProcessMemory(hPro, remoteBuffer, ref tvItem, Marshal.SizeOf(tvItem), IntPtr.Zero);
                if (bSuccess == false)
                {
                    Console.WriteLine("写入远程地址失败");
                    continue;
                }
                int r3 = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETITEM, 0, remoteBuffer);
                if (r3 == 0)
                {
                    Console.WriteLine("选择项操作失败");
                    continue;
                }
                bSuccess = WinAPIHelper.ReadProcessMemory(hPro, remoteBuffer, localBuffer, Marshal.SizeOf(tvItem), IntPtr.Zero);
                if (bSuccess == false)
                {
                    Console.WriteLine("读取远程地址失败");
                    continue;
                }
                WinAPIHelper.TVITEM retItem = (WinAPIHelper.TVITEM)Marshal.PtrToStructure(localBuffer, (Type)typeof(WinAPIHelper.TVITEM));
                int readLen = 0;
                IntPtr pStrLocaAddress = Marshal.AllocHGlobal(MAX_TVMSTRING);
 
                bSuccess = WinAPIHelper.ReadProcessMemory(hPro, pStrBufferMemory, pStrLocaAddress, MAX_TVMSTRING, out readLen);
                string pszItemText = Marshal.PtrToStringUni(pStrLocaAddress);
                // Console.WriteLine(pszItemText);
                item.Handle = tvItem.hItem;
                item.Text = pszItemText;
                bool withOutAdd = false;
                bool containsAdd = false;
                if (item.OwnChild)
                {
                    goto NEXTITEM;
                }
                if (containsList != null)
                {
                    foreach (var conItem in containsList)
                    {
                        if (pszItemText.Trim().Contains(conItem.Trim()))
                        {
                            containsAdd = true; goto ADDITEM;
                        }
                    }
                }
                if (withOutList != null)
                {
                    bool isContains = false;
                    foreach (var outItem in withOutList)
                    {
                        if (pszItemText.Trim().Contains(outItem.Trim()))
                        {
                            isContains = true;
                            goto NEXTITEM;
                        }
                    }
                    if (!isContains)
                    {
                        withOutAdd = true;
                        goto ADDITEM;
                    }
                }
 
            ADDITEM:
                if ((withOutList == null && containsList == null) || (withOutAdd || containsAdd))
                {
                    if (withOutAdd)
                    {
                        if (withOutResultItems.Count < withOutPreferenceCount && takeCount - containsPreferenceCount > withOutResultItems.Count)
                        {
                            withOutResultItems.Add(item);
                            addCount++;
                        }
                    }
                    if (containsAdd)
                    {
                        if (containsResultItems.Count < containsPreferenceCount && takeCount - withOutPreferenceCount > containsResultItems.Count)
                        {
                            containsResultItems.Add(item);
                            addCount++;
                        }
                    }
                    containsAdd = false;
                    withOutAdd = false;
                    if (addCount == takeCount)
                        break;
                }
            NEXTITEM:
                retval = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETNEXTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_NEXTVISIBLE, new IntPtr(retval));
                index++;
            }
            if (localBuffer != IntPtr.Zero)
            {
                try { Marshal.FreeHGlobal(localBuffer); }
                catch { }
            }
            if (remoteBuffer != IntPtr.Zero)
            {
                try { WinAPIHelper.VirtualFreeEx(hPro, remoteBuffer, 0, WinAPIHelper.MEM_RELEASE); }
                catch { }
            }
            if (pStrBufferMemory != IntPtr.Zero)
            {
                try { WinAPIHelper.VirtualFreeEx(hPro, pStrBufferMemory, 0, WinAPIHelper.MEM_RELEASE); }
                catch { }
            }
            if (hPro != IntPtr.Zero)
            {
                try { WinAPIHelper.CloseHandle(hPro); }
                catch { }
            }
            withOutResultItems.AddRange(containsResultItems);
            return withOutResultItems;
        }
 
        static public bool SelectItems(IntPtr hTv, List<WinTreeViewItem> items)
        {
            if (items.Count < 1) return false;
 
            int r1 = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_SELECTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_CARET, items[0].Handle);
            if (items.Count == 1) return r1 == 1 ? true : false;
            IntPtr hPro = WinAPIHelper.OpenProcess(WinAPIHelper.PROCESS_ALL_ACCESS, false, WndHelper.GetProcessId(hTv));
            IntPtr remoteBuffer = WinAPIHelper.VirtualAllocEx(hPro, IntPtr.Zero, buff_size, WinAPIHelper.AllocationType.Commit, WinAPIHelper.MemoryProtection.ExecuteReadWrite);
            for (int i = 1; i < items.Count; i++)
            {
 
                WinAPIHelper.TVITEM tvItem = new WinAPIHelper.TVITEM();
                tvItem.hItem = items[i].Handle;
                tvItem.mask = WinAPIHelper.TVIF_STATE;
                tvItem.state = WinAPIHelper.TVIS_SELECTED;
                tvItem.stateMask = WinAPIHelper.TVIS_SELECTED;
                int size = Marshal.SizeOf(tvItem);
                bool result = WinAPIHelper.WriteProcessMemory(hPro, remoteBuffer, ref tvItem, size, IntPtr.Zero);
                int retval = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_SETITEM, 0, remoteBuffer);
 
                Thread.Sleep(100);
            }
            if (remoteBuffer != IntPtr.Zero)
            {
                try { WinAPIHelper.VirtualFreeEx(hPro, remoteBuffer, 0, WinAPIHelper.MEM_RELEASE); }
                catch { }
            }
            if (hPro != IntPtr.Zero)
            {
                try { WinAPIHelper.CloseHandle(hPro); }
                catch { }
            }
            return true;
        }
 
 
    }

c#文件操作实现资源管理器的一些功能,实现树形浏览全部文件,并且在LISTVIE显示具体信息, c#文件操作,有树视图做的,有点想资源管理器,实现树形浏览全部文件,并且在LISTVIEw显示具体文件的信息, 立即下载

相关推荐

Python模拟发送SOME/IP消息(Scapy模块)

SOMEIP提供服务、订阅、响应、通知等Python代码示例

liluo0815481的博客 3068

C#的TreeView控件(树控件)

为树控件中的节点设置图标TreeView控件(树控件)可以为用户显示节点层次结构,每个节点又可以包含子节点,包含子节点的节点叫父节点。就像在Windows操作系统的Windows资源管理器功能的左窗口中显示文件和文件夹一样。一、添加和删除树节点。

wenchm的博客 6763

5分钟搞定!用Keil MDK将STM32F103C8T6工程无缝迁移到ZET6开发板

本文详细介绍了如何在Keil MDK环境下快速将STM32F103C8T6工程迁移到ZET6开发板,涵盖硬件差异对比、工程配置调整、外设适配及编译排错等关键步骤,帮助开发者5分钟内完成工程移植,大幅提升开发效率。

weixin_30879169的博客 408

WPF 自定义TreeView控件样式,仿QQ联系人列表

根据思路,我们需要设置三个样式,TreeView样式,TreeViewItem样式,HierarchicalDataTemplate分层模板样式。像这种联系人列表一般涉及到多层级数据,而且有很多数据是需要动态更新的,如果通过手动一条条增加数据反而更复杂,而且不方便。默认的TreeView控件四周会有边距,因此需要设置下TreeView的样式。另外鼠标经过和鼠标选中的背景色需要变化,因此还需要设置TreeViewItem的样式。分层模板中存在两种样式,一种是分组样式,一种是人员样式。

weixin_53370274的博客 1835

VSCode连接SAP ABAP开发环境

本文介绍了使用VSCode连接ABAP开发环境的详细步骤。首先通过SICF或SMICM事务码获取ABAP连接地址,然后安装ABAP remote filesystem插件。提供了两种创建连接的方法:通过命令面板逐步配置(输入服务器地址、账号、系统标识等)或直接编辑JSON配置文件。最后通过命令面板选择已创建的连接即可完成连接,连接成功后可在VSCode左侧工作区查看ABAP系统内容进行开发。JSON配置方式更为简便推荐。整个流程帮助开发者摆脱复杂的Eclipse配置,实现快速便捷的ABAP开发环境搭建。

weixin_45293769的博客 2213

Android性能分析——hprof文件分析(一)

hprof  文件是 Java 堆转储文件(Heap Dump File)的标准格式,用于保存 Java 虚拟机(JVM)在某个时间点的内存快照。这种文件对于分析内存泄漏、内存使用情况和对象分配模式非常有用。

小旭的专栏 1877

treeview 实现类似qq列表

&#13; #include enum {    COLUMN = 0,    NUM_COLS};void on_changed(GtkWidget * widget, gpointer statusbar){    GtkTreeIter iter;    GtkTreeModel *model;    char *value;    if (gtk_tree_se...

dragon434的专栏 388

基于Python的军事装备信息爬虫实战:Scrapy+Playwright+智能反反爬技术

本文将详细介绍如何使用Python构建一个高效的军事装备信息爬虫系统。我们将从基础的HTTP请求开始,逐步深入到使用Scrapy框架、Playwright浏览器自动化以及最新的反反爬技术。文章包含完整的代码实现、性能优化策略以及数据处理方案,旨在为读者提供一个全面的军事信息爬取解决方案。关键词:Python爬虫、军事装备、Scrapy、Playwright、反反爬。

2201_76125261的博客 1155

C# 高仿腾讯QQ (实现QQ好友列表-基于ListBox的绘法)

C#实现QQ好友列表,一直是我网上百搜却不得其解的控件,几乎找不到相关的信息,而找到的也不是我想要的那种。不过,曾在优快云上看过到过网上一位大牛用C++实现QQ好友列表这种效果,当然,对于我这个C++基本没学过的小程序员来说,读他的代码却有点像看天书.....不过还好,C++代码看不懂,但从他的文章中却给我了一个实现QQ好友列表的思路-基于ListBox绘法 之前曾...

weixin_30542079的博客 1022

ASM准入小助手卸载没有密码的方法:读取明文密码2024年7月有效

在一次工作过程中,电脑中意外的安装了一个ASM准入小助手软件,工作结束以后回来发现没有卸载,然后就决定把它卸载掉,但是居然给了我一个大大的提示框:由于联系不到当时给我安装的那个人了,所以一时陷入了焦灼的状态,因为我安装另一个终端准入,会直接提示冲突了。所以经过注册表(regedit)、任务管理器等各种折腾之后,最后都失败了,然后想起了多年前在吾爱论坛学到过的东西,最后意外的找到了密码,然后就完美成功卸载了。

布啦啦 7804

华为的LTC(Lead to Cash,从线索到现金)流程是其销售管理体系的核心,覆盖了从发现销售线索到最终收回现金的全过程,强调端到端的业务贯通和以客户为中心的运营理念

华为LTC流程是覆盖销售全周期的管理体系,包含四大阶段:线索转机会(LTO)、机会转订单(OTO)、订单转交付(OTD)、交付转现金(DTC)。其核心采用"铁三角"团队模式(AR/SR/FR协作),通过多部门联合评审把控关键节点,实现端到端业务贯通。该流程与IPD、MTL、ITR等体系高效协同,结合iSales平台实现数字化管理,有效提升销售效率、客户满意度和资金回笼速度。

金牌架构师 1720

C# 操作其他进程ListView

由于上篇C#操作QQ的TreeView控件以及详细讲解过如何操作其他进程的控件的流程,所以关于如何操作我就不在啰嗦了 主要实现流程如下 1), 获取列数 获取列数需先获取列的索引指针 columnIndex = WinAPIHelper.SendMessage(lvHwnd, (int)WinAPIHelper.LVM.GETHEADER, 0, 0); .csharp...

weixin_30505043的博客 218

微软商店报错“此产品当前不可用”?终极修复指南

微软商店报错“此产品当前不可用”?终极修复指南

安德洛夫 3809

C#编写的通讯录

软件设计内容 1.1设计构思 通讯录系统主要功能用户的登录以及数据的维护。 用户登录:在数据库里设置user表,对具有用户名和密码的人方可访问数据库中其他数据。 数据的维护:包括数据的查询、添加、修改、删除的功能,对数据库中联系人进行各种操作。 1.2软件功能的验收标准 一、有较为美观简洁大方的菜单,能保证用户方便、直观、快捷的熟悉并使用软件的各项功能。 二、要求设计并实现一

研创物联 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#控件的闪烁问题解决方法总结

最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体是TreeView控件会闪烁,语言为C#,IDE为VS2005。在查阅一些资料,使用了一些基本技术后(如开启双缓冲),发现没什么效果。 于是使用Profiler工具,查找出瓶颈在于每次更新完界面的EndUpdate操作(使用这个是为了减少界面更新次数,但这里不理想是因为控件中中的元素很多),猜想大概每次更新...

weixin_30621711的博客 95

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汇编实现多列类TreeView

这是我学习汇编写的一个程序移出来的代码,编译成LIB基础类在我的资源共享里,欢迎大家测试。目前为0.1版,未优化功能也不太全以后在弄吧呵呵。   以下是此LIB使用说明,我的环境为 XPsp3 +RADASM。有啥米问题QQ:285979593留言哒。         ;关于每个函数的返回值可以根据自己需要建立相应的结构      ;此0.1版本未优化,功能也不太全以后在弄

X_FOCUS的专栏 1599

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色   在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件进行控制,但对于WinForm则没有这样方便。申明一下,我在这儿所说的改变当前节点的字体与颜色,主要是在WinForm中的TreeView控件,当前选中节点后,其失去鼠标焦点后节点的字体与颜色...

.NET快速开发框架 267

C#遍历目录

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namesp

Neok HOME 1256

c#ktv项目思维导图_GitHub - joysenlong/MindMapUserControlForWinForm: 这是一个可供Winform使用的思维导图的自定义控件 This is a u...

这是一个可供Winform使用的思维导图的自定义控件 This is a user control of MindMap for C# WinForm它允许你在Winform程序上集成思维导图,就像使用普通自定义控件一样。它并不依赖任何第三方DLL或控件库。你只需要引用WlxMindMap.dll就可以在窗口设计器中直接拖入到你的程序中。其开发该控件的初衷是用来选择代替TreeView控件,让用户...

weixin_33873270的博客 301

界面控件DevExpress WPF v26.1新版亮点 - TreeView、Spreadsheet控件功能升级

在接下来的系列文章中,我将为大家一一介绍DevExpress WPF v26.1在新版本中的更新亮点,希望能帮助到大家~

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 718

此处记载查询到重要资料链接

1.ASCII表 https://wenku.baidu.com/view/695d89b76429647d27284b73f242336c1eb930c2.html?from=search 2. 未能加载正确的程序集XXX或其某一依赖项。。。 https://blog.youkuaiyun.com/biyusr/article/details/7279791?utm_so...

Jessyzhao_0的博客 593

界面控件DevExpress Blazor UI v23.2 - 浅谈增强的可访问性

本文将主要介绍界面控件DevExpress Blazor UI在之前发布的v23.2版本中增强的可访问性,欢迎下载最新版体验!

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1016

treeView和递归的简单运用

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Task

.NET学习者。 509
上一篇: Visual Studio 2010 Macros Stop Working
下一篇: 转帖:扩展jQuery easyui datagrid增加动态改变列编辑的类型
VCACC
博客等级 码龄17年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值