Qt 简单截图工具(三) 识别鼠标指向窗口、控件、图标保存为图片 您所在的位置:网站首页 qt截取图片 Qt 简单截图工具(三) 识别鼠标指向窗口、控件、图标保存为图片

Qt 简单截图工具(三) 识别鼠标指向窗口、控件、图标保存为图片

2024-06-26 19:57| 来源: 网络整理| 查看: 265

文章目录 前言一、实现步骤总结

前言

实现滑动截屏: Qt 简单截图工具(一) 高仿QQ截屏 滑动截屏 美化样式: Qt 简单截图工具(二) 添加菜单栏,添加取色器、切图功能

本文实现识别鼠标指向窗口、控件、图标保存为图片这一功能,为了方便区分,该功能将不在原先类(CustomSlidScreenCapture)实现,与滑动截屏中雷同的操作也不再实现,本文主要讲解如何获取桌面不同控件的位置大小并进行截图的方法。

一、实现步骤 获取windows下所有窗口的句柄,并将其中处于显示状态的、活跃的窗口进行保存。

重写函数MyEnumWindowsProc(HWND _hwnd, LPARAM _lparam),这里一定要将函数声明为全局函数,不可在类中声明。

bool CALLBACK MyEnumWindowsProc(HWND _hwnd, LPARAM _lparam);

使用递归的方式遍历Window下所有存在的窗口,满足条件的窗口保存其句柄与窗体矩形

std::vector allWindowRect; //存放窗口矩形 std::vector allWindowHwnd; //存放窗口句柄 bool CALLBACK MyEnumWindowsProc(HWND _hwnd, LPARAM _lparam) { if (::IsWindow(_hwnd) && ::IsWindowVisible(_hwnd)) { RECT tempRect; QRect tempQRect; ::GetWindowRect(_hwnd, &tempRect); tempQRect.setTopLeft(QPoint(tempRect.left, tempRect.top)); tempQRect.setBottomRight(QPoint(tempRect.right, tempRect.bottom)); allWindowRect.push_back(tempQRect); allWindowHwnd.push_back(_hwnd); ::EnumChildWindows(_hwnd, (WNDENUMPROC)MyEnumWindowsProc, 0); } return true; }

设置默认鼠标移动进入鼠标移动响应函数,方便实时获取鼠标位置。

//默认鼠标移动进入鼠标移动响应函数 this->setMouseTracking(true);

既然要实时的将当前鼠标指向的控件显示出来,就需要计算离当前鼠标最近最小的矩形,可以通过计算当前鼠标位置距离矩形四个边的距离和来判断,距离和最小的那个矩形就是鼠标指向的最小矩形。根据需要创建如下结构体:

struct MyRect { QRect myRect_; //当前矩形 int distance_; //点与矩形四边距离和 };

查找最小矩形

void CustomWidgetScreenCapture::mouseMoveEvent(QMouseEvent *event) { //获取当前点 mouse_now_point_ = event->pos(); myRectRestlt.clear(); //获取所有鼠标在其范围内的矩形 for (std::vector::iterator it = allWindowRect.begin() + 1; it != allWindowRect.end(); it++) { if (it->contains(mouse_now_point_.x(), mouse_now_point_.y())) { //用于计算鼠标当前点到各个边的距离之和 CalculataRectDistance(*it); } } MyRect temp_myrect; //找出最小矩形 for (std::vector::iterator it = myRectRestlt.begin() + 1; it != myRectRestlt.end(); it++) { if (it->distance_


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有