跨进程点击TreeView的节点

本文介绍了一种在TreeView中模拟双击节点的技术方案,通过发送特定消息选定节点并获取节点矩形区域,最终通过模拟双击事件触发相应操作。此外还提供了一种使用mouse_event进行真实感模拟的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  前期工作是要找到TreeView的句柄,这个不在本文讨论范围。

  使用SendMessage(TreeViewHwnd, TVM_SELECTITEM, TVGN_CARET, ItemHwnd)可以选定要操作的节点,而TVM_GETITEMRECT消息可以取得节点Rect,再配合WM_LBUTTONDBLCLK消息,就实现双击节点的效果了。 

 

    hTree = FindWindowEx(hMain, NULL, "TTreeView", NULL);
    if (hTree==NULL)
    {
        MessageDlg("没运行程序吧!",  mtWarning, TMsgDlgButtons() << mbOK, 0);
    }
    else
    {
        //开工
        HTREEITEM hItem = TreeView_GetRoot(hTree);
        hItem = TreeView_GetNextItem(hTree, hItem, TVGN_CHILD);
        ::SendMessage(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem);
        TreeView_EnsureVisible(hTree, hItem);
        DWORD pid = 0;
        GetWindowThreadProcessId(hTree,&pid);

        HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,true,pid);
    
        RECT *prect=(RECT*)VirtualAllocEx(hProcess, NULL, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
        RECT rect={0};
        unsigned long n=0;
    
        *(HTREEITEM*)&rect = hItem;
        WriteProcessMemory(hProcess, prect, &rect, sizeof(RECT), NULL);
        ::SendMessage(hTree, TVM_GETITEMRECT, (WPARAM)FALSE, (LPARAM)prect);
        ReadProcessMemory(hProcess,prect,&rect,sizeof(RECT),&n);
    
        POINT pt={0};
        pt.x = rect.left + (rect.right-rect.left)/2;
        pt.y = rect.top + (rect.bottom-rect.top)/2;

        ::SendMessage(hTree, WM_LBUTTONDBLCLK, 0, MAKELPARAM((WORD)pt.x,(WORD)pt.y));

        //释放内存
        CloseHandle(hProcess);
        VirtualFreeEx(hProcess, prect, 0, MEM_RELEASE);
    }

 

 

  上面是针对TreeView在后台的示例,并且点击了第一个子节点。

  如果TreeView在前台,可以使用mouse_event,有种真实鼠标模拟的感觉:

        //转换下坐标
        ::ClientToScreen(hTree,&pt);

        //鼠标事件
        SetCursorPos(pt.x, pt.y);
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0,0);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0,0);
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0,0);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0,0);

 

  

转载于:https://www.cnblogs.com/richardw/archive/2012/09/16/2687136.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值