怎么模拟向其它进程的TreeView指定节点发送鼠标双击消息?

解决方案 »

  1.   

    发双击你要达到什么目的?可以发其它的来替代,
    TVN_SELCHANGED 。TVN_ITEMEXPANDED。TVN_ITEMEXPANDING。TVN_SELCHANGING 
      

  2.   

    发双击消息直接打开另外一个窗体,不需要用鼠标去双击树的节点
    TVN_SELCHANGED都试过了,好象不行
      

  3.   

    查了MSDN,好象有一个NM_DBLCLK的,没有给出怎么用,试着按下面写了一下,但好象也不行
     NMHDR pnmh;
     pnmh.hwndFrom=parent_hwnd;//控件所以窗体句柄
     pnmh.idFrom=idCtrl;//idCtrl是控件ID=2006
     pnmh.code=NM_DBLCLK;
     ::SendDlgItemMessage(parent_hwnd,2006,WM_NOTIFY,(WPARAM)NodeHTreeItem,(LPARAM)&pnmh);请高手指正!!不胜感激!!!
      

  4.   

    NMHDR   pnmh; 
    pnmh.hwndFrom=m_tree.GetSafeHwnd();//控件所以窗体句柄 
    pnmh.idFrom=IDC_TREE1;//idCtrl是控件ID=2006 
    pnmh.code=NM_DBLCLK; 
    SendMessage(WM_NOTIFY,(WPARAM)IDC_TREE1,(LPARAM)&pnmh); 
      

  5.   

    老大,不行啊,我是先用SendMessage试了,再用SendDlgItemMessage试的
    我这个程序的目的是给一个有树型控件的程序写一个辅助程序,在树型控件看不到的情况下从这个辅助程序发消息到树型控件,模拟鼠标双击节点的事件,让它打开一个窗体
      

  6.   

    1。4楼的没问题,我添加了NM_DBLCLK响应函数试了的,没问题,可以跟到响应函数中,看你怎么处理了。
    2. 你这样写很绕,把双击那部分的代码提出来,单独封一个函数,可以在这里调用,也可以在双击时调用。另,我用SendDlgItemMessage发TVM_ 消息成功了的,可是NM_ 都没成功,不知有哪位仁兄可以不吝赐教
      

  7.   

    4楼代码那是在自己的程序空间里,在程序里自己发消息给自己,我没有试,应该是可以的
    但是我现在不是这样子的,控件窗体句柄是用FindWindow找到的,树型控件ID是用spy++查看到的,我现在就是不要去用鼠标双击节点,而是从我的辅助程序里发消息给另外程序的树型节点,实现鼠标的双击功能
      

  8.   

    已经注入到对方地址空间,其它问题都已经解决,现在就是不知道怎么模拟对树型控件指定节点发鼠标双击消息,我不想用发WM_LBUTTONDOWN WM_LBUTTONUP来模拟,
    不知哪位兄台赐教一二,谢谢了!!!
      

  9.   

    我觉得8楼有道理,当你向其他进程发送TVN_XXX消息时,要把TVITEM结构写入到远程进程地址。
    下面是一个实例:hwnd=FindWindow("#32770","Windows 任务管理器");
    hwnd=FindWindowEx(hwnd,0,"#32770",0);
    hwnd=FindWindowEx(hwnd,0,"SysListView32",0); if (!hwnd)
    MessageBox(NULL,"[Windows 任务管理器] 尚未启动!","错误!",NULL);
    else
    {
    GetWindowThreadProcessId(hwnd, &PID);

    hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    if (!hProcess)
    MessageBox(NULL,"获取进程句柄操作失败!","错误!",NULL);
    else
    {
    plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
    p_MyItemText=(char*)VirtualAllocEx(hProcess, NULL, 12, MEM_COMMIT, PAGE_READWRITE); if ((!plvitem)||(!p_MyItemText))
    MessageBox(NULL,"无法分配内存!","错误!",NULL);
    else
    {
    MessageBox(NULL,"本演示程序将更改TaskManager中第6个项目中第1列的内容。","提示",NULL);

    iItem=5;//5在这里是第六个(从零开始)
    lvitem.iSubItem=0;//同上
    lvitem.pszText=p_MyItemText;

    WriteProcessMemory(hProcess, p_MyItemText, &str_MyItemText, 12, NULL);
    WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
    //向目标程序发送LVM_SETITEMTEXT消息
    SendMessage(hwnd, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
    }
    }
    }

    //释放内存
    CloseHandle(hwnd);
    CloseHandle(hProcess);
    VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
    VirtualFreeEx(hProcess, p_MyItemText, 0, MEM_RELEASE);
      

  10.   

    非常感谢各位高手的帮助!!
    但还是没有回答我的问题
    我的程序已经进入到目标程序的地址空间,不需要象10楼的那样操作了,也能直接用宏TreeView_GetItem TreeView_Expand等来对目标程序的树型控件进行操作,可以对目标树型控件进行任何操作(添,删,改,查节点),只是我现在想模拟一下对指定节点的鼠标双击,就不知道怎么做了.急啊!!!!
      

  11.   

    tsinghuait兄 请问你是怎么解决的,望能指点