★卢培培★ ── 欢迎光临卢培培(goodname008)的BLOG

人生真正的快乐,多在贫家茅舍,少在富室红楼。

用户操作
[即时聊天] [发私信] [加为好友]
卢培培ID:goodname008
80521次访问,排名1283(1),好友0人,关注者0人。
goodname008的文章
原创 22 篇
翻译 0 篇
转载 5 篇
评论 288 篇
卢培培的公告


只有干不成事的人
没有干不成的事


代码下载说明:请将代码下载地址的链接复制到浏览器的地址栏,按下回车即可正常下载。

最近评论
HotUs:下载不了了,能不能发一份到我邮箱
hontus@163.com
谢谢
HotUs:下载不了了,能不能发一份到我邮箱
hontus@163.com
谢谢
jingang123gz:在C# 中怎么屏蔽WIN键啊?????
kennylyj:我在做类似的东西的时候遇到一个问题:
由于需要将一些16位的DOS程序的输出导出,因此使用了管道,但直接CreateProcess这些程序是不行的,必须通过ComSpec这个环境变量得到命令行程序的路径并把要运行的DOS程序的路径及相关参数作为命令行程序的参数才行,或者是先运行cmd/command,然后通过标准写端口写入要启动的程序的参数
而这样做却导致系统的虚拟机程序……
mycaibo:原来可以下载呀,我还自己写了一遍,不过说KBDLLHOOKSTRUCT没有定义,也不知道是为什么,谢谢哈
文章分类
收藏
    相册
    其它图片
    文章用图
    A.我的软件
    1.注册表大师 v2.0
    2.窗口间谍
    3.图易贴 v1.1
    B.强烈推荐
    1.VB打造超酷个性化菜单[一]
    2.VB打造超酷个性化菜单[二]
    3.VB打造超酷个性化菜单[三]
    4.剖析VC++函数调用约定
    C.有脚印的地方
    CSDN--中国软件网
    微软中国社区
    微软中文新闻组
    D.开放源代码
    1.鼠标感应器
    2.VB自绘菜单类
    3.你想要钱吗?
    E.友情链接
    1. 凝尘
    2. 羽毛羽毛
    3. 泗水寻芳
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 跨进程实现在Tree中快速定位节点收藏

    新一篇: 将CMD的输入输出重定向到自己的进程 | 旧一篇: 利用底层键盘钩子拦载任意按键(回调版)

        前些日子写软件时,需要实现一个功能,就是在Tree中快速定位节点,比如注册表编辑器左边的Tree,只要给出Tree中的节点路径(以“\”分隔),就可以快速将树展开,并将当前节点定位到指定的节点。功能的实现并不难,但稍有些麻烦。原因在于,如果是本进程中的Tree,只要发消息就可以了,但如果是另外一个进程中的Tree,就要在那个进程中申请内存,将Tree节点的文字复制到这块内存,然后再把这块内存的数据复制到本进程的一块内存中,才能与指定的节点路径相比较。由于这个功能还有一些可一般化的东西,所以就写了一个DLL,只要给出Tree的句柄和节点路径,就可以展开这颗树并定位节点。

         DLL源代码如下:

    /********************************************************************/

    /* 文件名: Tree.cpp                                                 */

    /*                                                                  */

    /* 功能: 标准 DLL ---- 跨进程展开 SysTreeView32 中指定的节点        */

    /*                                                                  */

    /* 作者: 卢培培 (goodname008)           时间: 2005.02.18            */

    /*                                                                  */

    /* BLOG: http://blog.csdn.net/goodname008                           */

    /********************************************************************/

     

    #include "stdafx.h"

    #include "Tree.h"

    #include "commctrl.h"

    #include <string>

     

    using namespace std;

     

    BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

    {

         switch (ul_reason_for_call)

         {

             case DLL_PROCESS_ATTACH:

             case DLL_THREAD_ATTACH:

             case DLL_THREAD_DETACH:

             case DLL_PROCESS_DETACH:

                  break;

         }

        return TRUE;

    }

     

    /********************************************************************/

    /*   : 跨进程展开 SysTreeView32 中指定的节点

    /*

    /*   : hTreeWnd         SysTreeView32 的句柄

    /*          lpszPath        SysTreeView32 中的节点路径(忽略大小写)

    /*

    /* 返回值: TRUE             成功

    /*         FALSE            失败(节点路径不存在时会返回失败, 但仍然展开)

    /*

    /*   : 在节点路径不存在的情况下, 本函数会尽可能展开存在的节点

    /********************************************************************/

    TREE_API BOOL APIENTRY ExpandTreeNode(HWND hTreeWnd, LPCSTR lpszPath)

    {

         string szPath = lpszPath;

     

         if (szPath.empty())

             return FALSE;

     

         DWORD dwProcessID = NULL;

         GetWindowThreadProcessId(hTreeWnd, &dwProcessID);

         if (!dwProcessID)

             return FALSE;

     

         HANDLE hProcess = NULL;

         hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);

         if (!hProcess)

             return FALSE;

     

         TVITEM tvItem, *pItem = NULL;

         ZeroMemory(&tvItem, sizeof(TVITEM));

         pItem = (TVITEM *)VirtualAllocEx(hProcess, NULL, sizeof(TVITEM), MEM_COMMIT, PAGE_READWRITE);

     

         tvItem.mask = TVIF_TEXT;

         tvItem.cchTextMax = 512;

         tvItem.pszText = (LPSTR)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

         tvItem.hItem = TreeView_GetRoot(hTreeWnd);

         if (!tvItem.hItem)

             return FALSE;

     

         string szPathNode;

         string::size_type nBackslashPos = -1;

         char szItemText[512] = {'\0'};

     

         do

         {

             szPathNode = szPath.substr(nBackslashPos + 1, szPath.find('\\', nBackslashPos + 1) - nBackslashPos - 1);

             do

             {

                  if (!WriteProcessMemory(hProcess, pItem, &tvItem, sizeof(TVITEM), NULL))

                       return FALSE;

     

                  if (!TreeView_GetItem(hTreeWnd, pItem))

                       return FALSE;

     

                  if (!ReadProcessMemory(hProcess, tvItem.pszText, szItemText, 512, NULL))

                       return FALSE;

     

                  if (lstrcmpi(szPathNode.c_str(), szItemText) == 0)

                  {

                       TreeView_SelectItem(hTreeWnd, tvItem.hItem);

     

                       if (TreeView_Expand(hTreeWnd, tvItem.hItem, TVE_EXPAND))

                       {

                           tvItem.hItem = TreeView_GetChild(hTreeWnd, tvItem.hItem);

                           if (!tvItem.hItem)

                                return FALSE;

                       }

                  }

                  else

                  {

                       tvItem.hItem = TreeView_GetNextSibling(hTreeWnd, tvItem.hItem);

                       if (!tvItem.hItem)

                           return FALSE;

                  }

     

             } while(lstrcmpi(szPathNode.c_str(), szItemText) != 0);

     

             nBackslashPos = szPath.find('\\', nBackslashPos + 1);

     

         } while(nBackslashPos != -1);

     

         VirtualFreeEx(hProcess, tvItem.pszText, NULL, MEM_RELEASE);

         VirtualFreeEx(hProcess, pItem, NULL, MEM_RELEASE);

     

         CloseHandle(hProcess);

     

         return TRUE;

    }

     

        头文件源代码:

    #ifdef TREE_EXPORTS

    #define TREE_API __declspec(dllexport)

    #else

    #define TREE_API __declspec(dllimport)

    #endif

    TREE_API BOOL APIENTRY ExpandTreeNode(HWND hTreeWnd, LPCSTR lpszPath);

     

        DEF文件如下:

    LIBRARY  Tree

     

    EXPORTS

    ExpandTreeNode     @1

        

       

    调用例程就不再这里给出了,DLLVC的调用例程都是用.net环境写的。

        源代码及调用例程的下载地址: http://csdngoodname008.51.net/Tree.zip

    *-------------------------------------------*

    *  转载请通知作者并注明出处,CSDN欢迎您!   *

    *  作者:卢培培(goodname008              *

    *  邮箱:goodname008@163.com                *

    *  专栏:http://blog.csdn.net/goodname008   *

    *-------------------------------------------*

    发表于 @ 2005年04月30日 17:47:00|评论(loading...)|编辑

    新一篇: 将CMD的输入输出重定向到自己的进程 | 旧一篇: 利用底层键盘钩子拦载任意按键(回调版)

    评论

    #清风过荷 发表于2005-11-21 16:04:00  IP: 202.102.200.*
    定位节点以后,想发鼠标双击节点的消息应如何做?请老大给小妹一个思路,我只会VB。
    #good 发表于2006-01-03 21:17:00  IP: 222.68.114.*

    1. 很好的文章

    2. www.sysinternals.com 上面有个 regjump
    看了你的文章可以做一个了:)

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 卢培培