QT:获取软件界面窗口的尺寸大小2025.5.8

news2025/7/19 18:40:05

在Windows系统中,获取软件界面窗口的尺寸大小可以通过多种方法实现,以下是基于不同场景的详细解决方案:


方法1:使用Windows API获取窗口尺寸

适用于获取外部应用程序窗口的尺寸(如记事本、计算器等)。

步骤说明:
  1. 获取窗口句柄
    通过进程ID或窗口标题找到目标窗口的句柄(HWND)。
  2. 调用GetWindowRectGetClientRect
    • GetWindowRect: 获取窗口在屏幕坐标系中的位置和尺寸(包括边框)。
    • GetClientRect: 获取窗口客户区(内容区域)的尺寸。
示例代码(C++):
#include <Windows.h>

// 通过窗口标题查找窗口句柄
HWND FindWindowByTitle(const wchar_t* title) {
    return FindWindowW(nullptr, title);
}

// 获取窗口尺寸(包括边框)
RECT GetWindowSize(HWND hwnd) {
    RECT rect;
    GetWindowRect(hwnd, &rect); // 屏幕坐标
    return rect;
}

// 获取客户区尺寸(仅内容区域)
RECT GetClientSize(HWND hwnd) {
    RECT rect;
    GetClientRect(hwnd, &rect); // 客户区坐标(左上角为0,0)
    return rect;
}

int main() {
    HWND hwnd = FindWindowByTitle(L"记事本");
    if (hwnd) {
        RECT windowRect = GetWindowSize(hwnd);
        int width = windowRect.right - windowRect.left;  // 窗口宽度
        int height = windowRect.bottom - windowRect.top; // 窗口高度

        RECT clientRect = GetClientSize(hwnd);
        int clientWidth = clientRect.right - clientRect.left;  // 内容区宽度
        int clientHeight = clientRect.bottom - clientRect.top; // 内容区高度
    }
    return 0;
}

方法2:通过Qt获取窗口尺寸

适用于Qt应用程序内部窗口的尺寸获取。

步骤说明:
  1. 直接访问QWidget的几何属性
    使用geometry()获取窗口位置和尺寸,或size()获取尺寸。
示例代码(Qt C++):
#include <QWidget>

void GetQtWindowSize(QWidget* window) {
    QRect geometry = window->geometry(); // 包含窗口边框的尺寸
    int width = geometry.width();
    int height = geometry.height();

    QSize clientSize = window->size(); // 客户区尺寸
    int clientWidth = clientSize.width();
    int clientHeight = clientSize.height();
}

在这里插入图片描述

方法3:使用命令行工具(外部工具)

无需编程,快速获取窗口尺寸。

工具推荐:
  1. WinSpy++
    可视化工具,直接点击窗口即可查看尺寸。
  2. AutoHotkey
    脚本获取窗口尺寸:
    F1::
    WinGetPos, X, Y, Width, Height, A
    MsgBox 窗口尺寸:%Width%x%Height%
    return
    

常见问题与解决方案

问题1:窗口最小化时无法获取正确尺寸
  • 解决方案
    在调用GetWindowRect前,确保窗口处于正常状态(非最小化):
    if (IsIconic(hwnd)) {
        ShowWindow(hwnd, SW_RESTORE); // 恢复窗口
        Sleep(100); // 等待窗口刷新
    }
    
问题2:高DPI屏幕下尺寸不准确
  • 解决方案
    启用DPI感知并手动缩放:
    // 在程序入口点添加
    SetProcessDPIAware(); // Windows API
    
问题3:多窗口同名导致获取错误句柄
  • 解决方案
    结合进程ID筛选窗口:
    HWND FindWindowByProcessId(DWORD pid) {
        HWND hwnd = nullptr;
        EnumWindows([](HWND hwnd, LPARAM lParam) -> BOOL {
            DWORD windowPid;
            GetWindowThreadProcessId(hwnd, &windowPid);
            if (windowPid == *(DWORD*)lParam && IsWindowVisible(hwnd)) {
                *(HWND*)lParam = hwnd;
                return FALSE;
            }
            return TRUE;
        }, (LPARAM)&pid);
        return hwnd;
    }
    

在这里插入图片描述

完整示例:获取外部窗口尺寸并显示在Qt界面

// MainWindow.h
#pragma once
#include <QMainWindow>
#include <QLabel>
#include <QPushButton>
#include <Windows.h>

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);

private slots:
    void onGetSizeClicked();

private:
    QLabel *labelSize;
    QPushButton *btnGetSize;
    HWND FindTargetWindow();
};

// MainWindow.cpp
#include "MainWindow.h"
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    QWidget *centralWidget = new QWidget(this);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);

    btnGetSize = new QPushButton("获取记事本尺寸", this);
    labelSize = new QLabel("窗口尺寸:未获取", this);

    layout->addWidget(btnGetSize);
    layout->addWidget(labelSize);
    setCentralWidget(centralWidget);

    connect(btnGetSize, &QPushButton::clicked, this, &MainWindow::onGetSizeClicked);
}

void MainWindow::onGetSizeClicked() {
    HWND hwnd = FindWindowW(nullptr, L"记事本");
    if (hwnd) {
        RECT rect;
        GetWindowRect(hwnd, &rect);
        QString sizeText = QString("窗口尺寸:%1x%2")
                               .arg(rect.right - rect.left)
                               .arg(rect.bottom - rect.top);
        labelSize->setText(sizeText);
    } else {
        labelSize->setText("未找到记事本窗口!");
    }
}

总结

  • 外部应用程序:优先使用Windows API(GetWindowRect/GetClientRect)。
  • Qt内部窗口:直接使用QWidget::geometry()size()
  • 快速调试:使用WinSpy++或AutoHotkey工具。

通过上述方法,您可以灵活获取各种软件界面窗口的尺寸,并根据需求应用到Qt开发中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ML-Agents】ML-Agents示例项目导入unity报错解决

最近在跑ML-Agents的示例代码&#xff0c;无奈往unity中导入项目后&#xff0c;就出现报错。本文简要描述了各个报错的解决方法。 文章目录 一、error CS0234: The type or namespace name InputSystem does not exist in the namespace UnityEngine (are you missing an assem…

Transformer Decoder-Only 参数量计算

Transformer 的 Decoder-Only 架构&#xff08;如 GPT 系列模型&#xff09;是当前大语言模型的主流架构&#xff0c;其参数量主要由以下几个部分组成&#xff1a; 嵌入层&#xff08;Embedding Layer&#xff09;自注意力层&#xff08;Self-Attention Layers&#xff09;前馈…

uni-app 中的条件编译与跨端兼容

uni-app 为了实现一套代码编译到多个平台&#xff08;包括小程序&#xff0c;App&#xff0c;H5 等&#xff09;&#xff0c;引入了条件编译机制。 通过条件编译&#xff0c;我们可以针对不同的平台编写特定的代码&#xff0c;从而实现跨端兼容。 一、条件编译的作用 平台差异…

Unity接入SDK之修改Unity启动页面

原理就是在Android Studio新建Activity继承UnityPlayerActivity&#xff0c;然后再Unity中修改启动页面。 一&#xff0c;Android Studio篇 首先新建一个项目&#xff0c; 新建完成之后基于新建的项目新建一个module&#xff0c;选择为Android Library类型 新建的Library再目…

yarn workspace使用指南

作用 Yarn workspace 是 Yarn 包管理工具中的一个功能&#xff0c;主要用于管理多包项目&#xff08;monorepo&#xff09;。它的主要作用如下&#xff1a; 支持多包结构&#xff1a;允许在一个仓库中管理多个独立的包或项目。项目间依赖管理&#xff1a;方便地在不同包之间添…

VUE el-select下拉框动态设置禁用,删除后恢复可选择

场景&#xff1a;点击新增添加按钮&#xff0c;列表table会新增一条包含下拉菜单的数据&#xff0c;如果其中任何一个下拉框选择了某个值&#xff0c;那么新增的下拉菜单的选项中该值是禁用状态&#xff0c;只能选择其他未被选中过的值。点击删除按钮后&#xff0c;已禁用的选项…

FPGA----基于ALINX提供的debian实现TCF

引言:接上问,我们使用自制的image.ub和boot.bin以及ALINX提供的debian8根文件系统,构建了petalinux,但是经测试,该文件系统无法启用TCF服务,即无法与Xilinx SDK建立连接,那么我们应该如何解决? FPGA----基于ZYNQ 7020实现定制化的EPICS通信系统-CSDN博客文章浏览阅读4…

木马查杀篇—Opcode提取

【前言】 介绍Opcode的提取方法&#xff0c;并探讨多种机器学习算法在Webshell检测中的应用&#xff0c;理解如何在实际项目中应用Opcode进行高效的Webshell检测。 Ⅰ 基本概念 Opcode&#xff1a;计算机指令的一部分&#xff0c;也叫字节码&#xff0c;一个php文件可以抽取出…

国产化Excel处理控件Spire.XLS系列教程:如何通过 C# 删除 Excel 工作表中的筛选器

在 Excel 文件中&#xff0c;筛选器&#xff08;Filter&#xff09;是一个常用的数据处理工具&#xff0c;可以帮助用户快速按条件筛选数据行。但在数据整理完成、导出、共享或打印之前&#xff0c;往往需要 删除 Excel 工作表中的筛选器&#xff0c;移除列标题中的下拉筛选按钮…

[sklearn] 特征工程

一.字典数据抽取 def dictvec():"""字典数据抽取:return: None"""# 实例化# sparse改为True,输出的是每个不为零位置的坐标&#xff0c;稀疏矩阵可以节省存储空间dict DictVectorizer(sparseFalse) #矩阵中存在大量的0&#xff0c;sparse存储只…

CI/CD与DevOps流程流程简述(提供思路)

一 CI/CD流程详解&#xff1a;代码集成、测试与发布部署 引言 在软件开发的世界里&#xff0c;CI/CD&#xff08;持续集成/持续交付&#xff09;就像是一套精密的流水线&#xff0c;确保代码从开发到上线的整个过程高效、稳定。我作为一名资深的软件工程师&#xff0c;接下来…

S7-1500——零基础入门1、工业编程基本概念

工业编程基本概念 一,数制与基本数据类型二,数字量信号三,模拟量信号一,数制与基本数据类型 本节主要内容 类别内容主题数制与基本数据类型数制讲解十进制、十六进制、二进制及其进位规则;基数、位权概念数据类型介绍PLC 使用的数据类型:未序列数据类型(bit、byte、wor…

六、快速启动框架:SpringBoot3实战

六、快速启动框架&#xff1a;SpringBoot3实战 目录 一、SpringBoot3介绍 1.1 SpringBoot3简介1.2 系统要求1.3 快速入门1.4 入门总结 二、SpringBoot3配置文件 2.1 统一配置管理概述2.2 属性配置文件使用2.3 YAML配置文件使用2.4 批量配置文件注入2.5 多环境配置和使用 三、…

万兴PDF-PDFelement v11.4.13.3417

万兴PDF专家(Wondershare PDFelement)是一款国产PDF文档全方位解决方案.万兴PDF编辑器软件万兴PDF中文版,专注于PDF的创建,编辑,转换,签名,压缩,合并,比较等功能.万兴PDF专业版PDF编辑软件,以简约风格及强大的功能在国外名声大噪,除了传统功能外,还提供OCR扫描,表格识别,创建笔…

机器学习-无量纲化与特征降维(一)

一.无量纲化-预处理 无量纲&#xff0c;即没有单位的数据 无量纲化包括"归一化"和"标准化"&#xff0c;这样做有什么用呢&#xff1f;假设用欧式距离计算一个公司员工之间的差距&#xff0c;有身高&#xff08;m&#xff09;、体重&#xff08;kg&#x…

C语言复习--柔性数组

柔性数组是C99中提出的一个概念.结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员。 格式大概如下 struct S { int a; char b; int arr[];//柔性数组 }; 也可以写成 struct S { int a; char b; int arr[0];//柔性数组 }; …

图形化编程如何从工具迭代到生态重构?

一、技术架构的范式突破 在图形化编程领域&#xff0c;技术架构的创新正在重塑行业格局。iVX 作为开源领域的领军者该平台通过图形化逻辑设计&#xff0c;将传统文本编程需 30 行 Python 代码实现的 "按钮点击→条件判断→调用接口→弹窗反馈" 流程&#xff0c;简化…

法国蒙彼利埃大学团队:运用元动力学模拟与马尔可夫状态模型解锁 G 蛋白偶联受体构象动态机制

背景简介 在生命科学领域&#xff0c;G 蛋白偶联受体&#xff08;GPCRs&#xff09;一直是研究的热点。它作为膜蛋白家族的重要成员&#xff0c;承担着细胞对多种刺激的响应任务&#xff0c;从激素、神经递质到外源性物质的信号传导都离不开它。据估计&#xff0c;约三分之一的…

网页Web端无人机直播RTSP视频流,无需服务器转码,延迟300毫秒

随着无人机技术的飞速发展&#xff0c;全球无人机直播应用市场也快速扩张&#xff0c;从农业植保巡检到应急救援指挥&#xff0c;从大型活动直播到智慧城市安防&#xff0c;实时视频传输已成为刚需。预计到2025年&#xff0c;全球将有超过1000万架商用无人机搭载直播功能&#…

数据结构-堆排序

1.定义 -堆中每个节点的值都必须大于等于&#xff08;或小于等于&#xff09;其左右子节点的值。如果每个节点的值都大于等于其子节点的值&#xff0c;这样的堆称为大根堆&#xff08;大顶堆&#xff09;&#xff1b;如果每个节点的值都小于等于其子节点的值&#xff0c;称为…