QT:获取软件界面窗口的尺寸大小2025.5.8
在Windows系统中,获取软件界面窗口的尺寸大小可以通过多种方法实现,以下是基于不同场景的详细解决方案:
方法1:使用Windows API获取窗口尺寸
适用于获取外部应用程序窗口的尺寸(如记事本、计算器等)。
步骤说明:
- 获取窗口句柄
通过进程ID或窗口标题找到目标窗口的句柄(HWND
)。 - 调用
GetWindowRect
或GetClientRect
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应用程序内部窗口的尺寸获取。
步骤说明:
- 直接访问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:使用命令行工具(外部工具)
无需编程,快速获取窗口尺寸。
工具推荐:
- WinSpy++
可视化工具,直接点击窗口即可查看尺寸。 - 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开发中。
相关文章:

QT:获取软件界面窗口的尺寸大小2025.5.8
在Windows系统中,获取软件界面窗口的尺寸大小可以通过多种方法实现,以下是基于不同场景的详细解决方案: 方法1:使用Windows API获取窗口尺寸 适用于获取外部应用程序窗口的尺寸(如记事本、计算器等)。 步…...

【ML-Agents】ML-Agents示例项目导入unity报错解决
最近在跑ML-Agents的示例代码,无奈往unity中导入项目后,就出现报错。本文简要描述了各个报错的解决方法。 文章目录 一、error CS0234: The type or namespace name InputSystem does not exist in the namespace UnityEngine (are you missing an assem…...
【网络安全】SQL注入
如果文章不足还请各位师傅批评指正! 想象一下,你经营着一家咖啡店,顾客可以通过店内的点单系统下单。这个系统会根据顾客的输入,向后厨发送指令,比如“为顾客A准备一杯拿铁”。 然而,如果有个不怀好意的顾客…...

Transformer Decoder-Only 参数量计算
Transformer 的 Decoder-Only 架构(如 GPT 系列模型)是当前大语言模型的主流架构,其参数量主要由以下几个部分组成: 嵌入层(Embedding Layer)自注意力层(Self-Attention Layers)前馈…...

uni-app 中的条件编译与跨端兼容
uni-app 为了实现一套代码编译到多个平台(包括小程序,App,H5 等),引入了条件编译机制。 通过条件编译,我们可以针对不同的平台编写特定的代码,从而实现跨端兼容。 一、条件编译的作用 平台差异…...
<C#>log4net 的配置文件配置项详细介绍
log4net 是一个功能强大的日志记录工具,通过配置文件可以灵活地控制日志的输出方式、格式、级别等。以下是对 log4net 配置文件常见配置项的详细介绍: 根元素 <log4net> 这是 log4net 配置文件的根元素,所有配置项都要包含在该元素内…...
excel单元格如果是日期格式,在C#读取的时候会变成45807,怎么处理
excel单元格如果是日期格式,在C#读取的时候会变成45807,怎么处理 excel单元格如果是日期格式,在C#读取的时候会变成45807,怎么处理 在 C# 中,Excel 日期被表示为一个数字,这是因为 Excel 内部将日期存储为…...

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

yarn workspace使用指南
作用 Yarn workspace 是 Yarn 包管理工具中的一个功能,主要用于管理多包项目(monorepo)。它的主要作用如下: 支持多包结构:允许在一个仓库中管理多个独立的包或项目。项目间依赖管理:方便地在不同包之间添…...
[学习]RTKLib详解:datum.c、download.c与lambda.c
RTKLib详解: datum.c、download.c 与 lambda.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解ÿ…...

VUE el-select下拉框动态设置禁用,删除后恢复可选择
场景:点击新增添加按钮,列表table会新增一条包含下拉菜单的数据,如果其中任何一个下拉框选择了某个值,那么新增的下拉菜单的选项中该值是禁用状态,只能选择其他未被选中过的值。点击删除按钮后,已禁用的选项…...

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

木马查杀篇—Opcode提取
【前言】 介绍Opcode的提取方法,并探讨多种机器学习算法在Webshell检测中的应用,理解如何在实际项目中应用Opcode进行高效的Webshell检测。 Ⅰ 基本概念 Opcode:计算机指令的一部分,也叫字节码,一个php文件可以抽取出…...
1.7 方向导数
(底层逻辑演进脉络)从"单车道"到"全路网"的导数进化史: 一、偏导数奠基(1.6核心) 诞生背景:多元函数分析需求 当变量间存在耦合关系时(如房价面积单价装修成本)…...
设计模式系列(01):总览与引导
设计模式系列(01):总览与引导 本文为设计模式系列第1篇,定位为总览和引导,系统梳理设计模式的核心思想、分类、UML、设计原则、典型场景、学习建议与常见误区,适合系统学习与团队协作。 目录 1. 前言2. 设计模式简介3. UML与设计模式4. 术语解释5. UML工具与PlantUML6. 面…...

国产化Excel处理控件Spire.XLS系列教程:如何通过 C# 删除 Excel 工作表中的筛选器
在 Excel 文件中,筛选器(Filter)是一个常用的数据处理工具,可以帮助用户快速按条件筛选数据行。但在数据整理完成、导出、共享或打印之前,往往需要 删除 Excel 工作表中的筛选器,移除列标题中的下拉筛选按钮…...
第二篇 客户端脚本安全
同源策略 限制了来自不同的"dociment"或脚本,对当前"dociment"读取或设置一些属性。 不同源:host(域名或ip),子域名,端口,协议。 对于当前页面来说,页面的源…...

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

CI/CD与DevOps流程流程简述(提供思路)
一 CI/CD流程详解:代码集成、测试与发布部署 引言 在软件开发的世界里,CI/CD(持续集成/持续交付)就像是一套精密的流水线,确保代码从开发到上线的整个过程高效、稳定。我作为一名资深的软件工程师,接下来…...

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

六、快速启动框架:SpringBoot3实战
六、快速启动框架: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扫描,表格识别,创建笔…...
LSP里氏替换原则
LSP强调子类必须能够替换父类。即子类应该具有与父类相同的行为和功能,而不仅仅是继承父类的属性和方法。LSP是对继承机制的约束规范、是指导接口与实现的设计原则。 LSP关键点 前置条件不能强化:子类方法的参数类型必须与父类相同或者更为宽松。后置条…...

机器学习-无量纲化与特征降维(一)
一.无量纲化-预处理 无量纲,即没有单位的数据 无量纲化包括"归一化"和"标准化",这样做有什么用呢?假设用欧式距离计算一个公司员工之间的差距,有身高(m)、体重(kg&#x…...

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

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

法国蒙彼利埃大学团队:运用元动力学模拟与马尔可夫状态模型解锁 G 蛋白偶联受体构象动态机制
背景简介 在生命科学领域,G 蛋白偶联受体(GPCRs)一直是研究的热点。它作为膜蛋白家族的重要成员,承担着细胞对多种刺激的响应任务,从激素、神经递质到外源性物质的信号传导都离不开它。据估计,约三分之一的…...
【PostgreSQL】不开启归档模式,是否会影响主从库备份?
PostgreSQL 不开启归档模式(archive_mode off)不会直接影响基于流复制(Streaming Replication)的主从备份,但可能会在特定场景下影响复制的健壮性和恢复能力。以下是详细分析: 1. 流复制的核心机制 流复制…...

网页Web端无人机直播RTSP视频流,无需服务器转码,延迟300毫秒
随着无人机技术的飞速发展,全球无人机直播应用市场也快速扩张,从农业植保巡检到应急救援指挥,从大型活动直播到智慧城市安防,实时视频传输已成为刚需。预计到2025年,全球将有超过1000万架商用无人机搭载直播功能&#…...
Shell脚本编程3(函数+正则表达式)
1.函数 1.1 定义 简单来讲,所谓函数就是把完成特定功能,并且多次使用的一组命令或者语句封装在一个固定的结构中,这个结构我们就叫做函数。从本质上讲,函数是将一个函数名与某个代码块进行映射。也就是说,用户在定义了…...