当前位置: 首页 > news >正文

winapi获取和修改camera raw界面元素数据

        camera raw 界面如下:

        需求就是根据 windows api 来操作界面右边的色温、色调、曝光等属性,进而对图片进行调色。根据 spy++ 捕获的窗口信息,理论上是可以拿到并修改值的。

        根据 class 可以先拿到窗口句柄:

#define CAMERA_RAW_CLASS_NAME "PSFilter_WindowClass"
HWND getCameraRawHwnd()
{HWND h;int len;while (true) {h = FindWindow(TEXT(CAMERA_RAW_CLASS_NAME), NULL);if (h == 0) {return 0;}len = GetWindowTextLength(h);if (len == 0) {    // 删除空窗口句柄SendMessage(h, WM_CLOSE, NULL, NULL);SendMessage(h, WM_DESTROY, NULL, NULL);SendMessage(h, WM_NCDESTROY, NULL, NULL);} else {break;}}return h;
}

        这里并没有直接调用 FindWindow() 方法,是因为在后来的实践中发现,当关掉 camera raw 窗口时,句柄可能还在,这样当再次打开 camera raw 窗口时,就存在两个 class 都为 PSFilter_WindowClass 的的句柄,像下面这种情况:

        而 FindWindow() 方法只能获取到第一个,而这个正是已关闭窗口的句柄缓存,拿不到任何数据。解决这个问题其实也可以调用 EnumWindows() 方法枚举出所有的窗口,然后拿 text 是否为空进行比较。但私以为这样效率较低,故而写了个 while 循环,若查询到的窗口 text 为空,那么直接调用 SendMessage() 方法向系统发送 WM_DESTROY 等消息删除该句柄,再重新查询,直到找到这个窗口为止,就目前来看循环也只会执行两三次而已。

        找到主窗口句柄后,就该寻找具体某个属性的值了,其实这里每个属性也都是一个子窗口。

         代码如下:

TestCache testCache;    // TestCache 类型后文有说明
static int num = 0;
EnumChildWindows(h, getMapData, NULL);// 获取所有属性及对应值并写入 map
BOOL CALLBACK getMapData(HWND hwnd, LPARAM lparam)
{int len = SendMessage(hwnd, WM_GETTEXTLENGTH, NULL, NULL);if (len == 0) {cout << endl;return true;}++num; ++len;TCHAR *text = (TCHAR *)malloc(sizeof(TCHAR) * len);memset(text, 0, len);SendMessage(hwnd, WM_GETTEXT, (WPARAM)len, (LPARAM)text);try {float val = stof(text);testCache[num].h = hwnd;testCache[num].val = val;} catch (exception &e) {cout << e.what() << endl;}return true;
}

        这里主要是调用 EnumChildWindows() 方法枚举出 camera raw 的所有子窗口,并逐一调用自定义的 getMapData() 方法,方法体中主要是调用 SendMessage() 向系统发送消息 WM_GETTEXTLENGTHWM_GETTEXT 来获取具体的值,可以看到程序中定义了个全局 static 变量 num,是因为每个属性并没有唯一的 id 与其对应,只能按某种规则对其筛选并排序,然后将排序的序号和每个属性对应,所以 ++num 的位置就比较重要了。

        拿到值后将所有的值以及对应的序号就存入了 map,如果只是查询属性值,直接定义个简单的 map<int, float> 就可以了,但是如果要修改这个值呢?是再重新调用 EnumChildWindows() 方法枚举所有子窗口,找到要修改的序号,修改对应的值?这样虽然是可以,并且在修改对应值后立即中止枚举,但效率还是蛮低下的,

        另外,我们已经知道获取元素值是调用 SendMessage() 方法向窗口句柄发送 WM_GETTEXT 消息,那么修改自然是向对应窗口发送 WM_SETTEXT 消息,既然是通过窗口句柄直接操作,那么在第一次枚举查询时可以将每个属性的窗口句柄一起记下来,这样在修改时直接向这个窗口发送修改消息即可。所以 testCache 结构定义如下:

typedef struct hwnd_val {HWND h;       // 窗口句柄float val;    // 属性值
} hwndVal;
typedef std::map<int, hwndVal> TestCache;

        当遍历完所有属性后,属性序号、属性所属窗口句柄、属性值就都存在 testCache 中了,这时就可以根据序号对某个属性进行修改了:

int id = 2;
float step = 1.0;
string vals = "";
float new_val = testCache[id].val + step;
if (new_val > 0) {vals = "+" + to_string(new_val);
} else if (new_val < 0) {vals = to_string(new_val);
} else {vals = "0";
}
char* val = const_cast<char*>(vals.c_str());
SendMessage(testCache[id].h, WM_SETTEXT, 0, (LPARAM)val);

        这里假设的是对序号为 2 的属性值做 +1 处理,待程序执行后,就可以看到 camera raw 界面的色温值 +1 了。

        至此也就实现了对 camera raw 界面元素数据的获取和修改,但具体到项目中应用,还需解决字符集、宽字符与字符转化、生成 dll 等诸多问题,此处不再赘述。

相关文章:

winapi获取和修改camera raw界面元素数据

camera raw 界面如下&#xff1a; 需求就是根据 windows api 来操作界面右边的色温、色调、曝光等属性&#xff0c;进而对图片进行调色。根据 spy 捕获的窗口信息&#xff0c;理论上是可以拿到并修改值的。 根据 class 可以先拿到窗口句柄&#xff1a; #define CAMERA_RAW_CLA…...

C++问答汇总_2023自用

C是一种通用编程语言&#xff0c;具有高级抽象、强类型和编译性能等特点。C语言具有许多特性&#xff0c;包括面向对象编程、模板、多态、运算符重载等等。它广泛应用于各种领域&#xff0c;如系统软件、嵌入式系统、游戏开发、科学计算等等。 1、C11相对于C98的新特性&#xf…...

IDA 实战--(2)熟悉工具

布局介绍 软件启动后会 有几个选项&#xff0c;一般直接选择Go 即可 之后的工作台布局如下 开始分析 分析的第一个&#xff0c;将PE 文件拖入工作区 刚开始接触&#xff0c;我们先保持默认选项&#xff0c;其它选项后面会详细讲解&#xff0c;点击OK 后&#xff0c;等待分析…...

Deep Unsupervised Learning using Nonequilibrium Thermodynamics论文翻译学习

Deep Unsupervised Learning using Nonequilibrium Thermodynamics Author: Jascha Sohl-Dickstein Link: http://proceedings.mlr.press/v37/sohl-dickstein15.pdf Score: ⭐️⭐️⭐️⭐️⭐️ Status: Done Type: Academic Journal 备注: 首篇扩散模型论文 A central prob…...

使用Autoware标定工具包联合标定相机和激光雷达

前面文章介绍了&#xff0c;安装autoware标定工具包、ros驱动usb相机、robosense-16线激光雷达的使用&#xff0c;本文记录使用Autoware标定工具包联合标定相机和激光雷达的过程。1.ros驱动相机&#xff0c;启动相机&#xff1b;启动激光雷达2.联合录制bag包rosbag record -a 参…...

了解线程安全

线程安全是多线程的重点和难点。 线程安全概念 线程安全&#xff1a;在多线程的各种随机调度顺序下&#xff0c;代码没有bug&#xff0c;都能够符合预期的方式来执行&#xff0c;此时认为线程安全 线程不安全&#xff1a;如果在多线程随机调度下代码出现bug&#xff0c;此时…...

【git】git版本控制

目录 1.在合适的位置打开bush,创建仓库 2.检查&#xff1a;跳转到当前文件夹&#xff0c;显示当前文件夹的相对路径 3.初始化 4.创建一个文本文件readme.txt 5.手动向readme文件中添加一些内容 6.把文件添加到暂存区 7.把文件提交到git仓库 8.手动修改readme.txt文件 9.查看当前…...

模电学习7. 三极管特性曲线与静态工作点

模电学习7. 三极管特性曲线与静态工作点一、三极管的伏安特性曲线1. 三极管的伏安特性曲线2. 三极管的静态工作点二、合适的静态工作点选择1. 合适静态工作点条件2. 静态工作点的确定三、使用立创EDA仿真查看静态工作点1. 搭建如下图所示测试电路2. 点击菜单仿真、仿真设置3. 运…...

LeetCode题解:633. 平方数之和,双指针,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/sum-of-square-numbers/ 解题思路&#xff1a; a和b一定是000到c\sqrt cc​之间的某个值。将a的初始值设为0。b的初始值设为c\sqrt cc​&#xff0c;b必须为整数。a和b向中间逼近&#xff0c;查找满足条件的值。由于a和b是…...

Keil编译头文件iec_std_functions.h错误解决

Keil 编译IEC61131-3库&#xff0c;头文件&#xff0c;大量出现以下错误&#xff1b; cast to type &#xff1f; is not allowed compiling resource1.c... ..\PLC\rts\matiec\lib\C\iec_std_functions.h(192): error: #119: cast to type "TIME" is not allowed…...

2022 赣育杯 CTF --- Crypto Lost_N wp

文章目录前言题目解题过程解题代码前言 这是去年江西省赛一道有点小坑的密码题&#xff0c;当时没做出来&#xff0c;今天回想起来重新做一下并且记录一下。 题目 Lost_N.py import gmpy2 from Crypto.Util.number import * # part1 flag bSangFor{} d getPrime(435) cou…...

【趋势分析方法三】MATLAB代码实现TFPW-MK检验

目前水文时间序列趋势分析的方法很多&#xff0c;主要分为参数检验和非参数检验两大类&#xff1a; 参数检验中常用的有线性回归法、滑动平均法、累积距平法等非参数检验则主要包括Mann-Kendal&#xff08;MK&#xff09;法和 Spearman 秩次相关法等 虽然从理论上讲&#xff…...

一文学会 Spring 整合 MyBatis

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

ElasticSearch - 文档 | 索引文档 | 检索文档 | 创建索引并指明映射

文章目录1. ElasticSearch是面向文档的2. 索引员工文档3. 检索员工文档4. 映射1. ElasticSearch是面向文档的 在应用程序中对象很少只是一个简单的键和值的列表。通常&#xff0c;它们拥有更复杂的数据结构&#xff0c;可能包括日期、地理信息、其他对象或者数组等。 Elastic…...

SQL中的DML、DDL、DCL分别是什么意思

SQL命令的分类 数据定义语言 DDL&#xff08;DataDefinition Language&#xff09; 是 SQL 语言集中负责数据结构定义。 DDL 的核心指令是CREATE、ALTER、DROP。 操作的对象包括&#xff1a;库、表、视图、索引等。 如&#xff1a;CREATE TABLE ; ALTER INDEX; DROP VIEW; 数据…...

kubeasz部署k8s高可用集群

前言&#xff1a;如无特殊说明&#xff0c;所有操作都用root账号在所有节点执行。 说明&#xff1a;kubeasz是一款国产开源的k8s部署软件&#xff0c;采用ansible role的部署方式&#xff0c;部署k8s二进制集群。熟悉ansible role的用该软件部署k8s方便快捷。 一、机器 deplo…...

2022年工程机械出口专题研究【重工】

文章目录2022年工程机械出口专题研究1、中国是全球工程机械第一大市场&#xff0c;竞争力逐步提升2、工程机械出口高增&#xff0c;市场分布趋于多元&#xff0c;企业营收获益3、海外市场高速增长原因为何&#xff1f;4、海外市场增长动能预测附件&#xff1a;2022年工程机械出…...

[python入门(51)] - python时间日期格式time和datetime

目录 ❤ 预备知识 ❤ UTC time Coordinated Universal Time ❤ epoch time ❤ timestamp&#xff08;时间戳&#xff09; ❤ stamptime时间戳 ❤ struct_time时间元组 ❤ format time 格式化时间 ❤ time模块​编辑 ❤ 获取当前时间的方法 ❤ 当传入默认参…...

别担心ChatGPT距离替代程序猿还有距离

经过多天对chat-GPT在工作的使用&#xff0c;我得出一个结论&#xff0c;它睁眼瞎说就算了&#xff0c;它还积极认错&#xff0c;绝不改正&#xff0c;错误答案极具误导性&#xff0c;啥也不说了&#xff0c;请看图。 经过N次较量它固执的认为 0011 1101 0110 0101在最高位是左…...

SpringBoot项目打包部署到阿里云服务器、通过Maven插件制作Docker镜像、部署项目容器、配置生产环境

制作通用模块jar包 通用模块不是运行的&#xff0c;而且要被其他模块引入的&#xff0c;所以该模块不能采用springboot打包方式制作jar包&#xff0c;否则其他模块无法引入通用模块。 1、修改通用模块&#xff0c;设置模块为非Springboot项目 <?xml version"1.0&qu…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...