zoukankan      html  css  js  c++  java
  • 跨进程点击TreeView的节点

      前期工作是要找到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);

      

  • 相关阅读:
    Elasticsearch搜索引擎学习笔记(二)
    Elasticsearch搜索引擎学习笔记(一)
    Redis集群(cluster模式)搭建(三主三从)
    Redis主从、哨兵
    oracle 数据查询 返回树形结构的每一级的id
    oracle 数据库查询 COALESCE字符函数
    java 生成不重复的6位数字 +年月日
    oracle 数据库查询CLOB类型 报错 【ORA-00932: 数据类型不一致: 应为 -, 但却获得 CLOB】
    oracle 数据表结构和数据 导入 导出
    sql 创建数据库表结构
  • 原文地址:https://www.cnblogs.com/richardw/p/2687136.html
Copyright © 2011-2022 走看看