当前位置: 首页 > 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…...

OpenGov的首个方案已上线Moonriver

随着公投128的通过&#xff0c;作为Runtime 2100的一部分&#xff0c;Moonbeam在Moonriver上推出了OpenGov。Moonbeam上的OpenGov部署将从Moonriver开始&#xff0c;以获得社区反馈。未来将举行公投&#xff0c;让社区来决定OpenGov如何发展并转移至Moonbeam。 Moonriver上的O…...

(三十一)大白话MySQL如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理

之前我们已经给大家深入讲解了在执行增删改操作时候的redo log的重做日志原理&#xff0c;其实说白了&#xff0c;就是你对buffer pool里的缓存页执行增删改操作的时候&#xff0c;必须要写对应的redo log记录下来你做了哪些修改 如下图所示&#xff1a; 这样万一要是你提交事…...

机器学习-基于KNN及其改进的汉字图像识别系统

一、简介和环境准备 knn一般指邻近算法。 邻近算法&#xff0c;或者说K最邻近&#xff08;KNN&#xff0c;K-NearestNeighbor&#xff09;分类算法是数据挖掘分类技术中最简单的方法之一。而lmknn是局部均值k最近邻分类算法。 本次实验环境需要用的是Google Colab和Google Dr…...

Zebec生态持续深度布局,ZBC通证月内翻倍或只是开始

“Zebec生态近日利好不断&#xff0c;除了推出了回购计划外&#xff0c; Nautilus Chain 、Zebec Labs等也即将面向市场&#xff0c;都将为ZBC通证深度赋能。而ZBC通证涨幅月内突破100%&#xff0c;或许只是开始。”近日&#xff0c;流支付生态Zebec生态通证ZBC迎来了大涨&…...

Leetcode.1238 循环码排列

题目链接 Leetcode.1238 循环码排列 Rating &#xff1a; 1775 题目描述 给你两个整数 n和 start。你的任务是返回任意 (0,1,2,,...,2^n-1)的排列 p&#xff0c;并且满足&#xff1a; p[0] startp[i]和 p[i1]的二进制表示形式只有一位不同p[0]和 p[2^n -1]的二进制表示形式也…...

spring boot的包扫描范围

目录标题一、误解二、正确的理解三、不同包也能扫描到Bean的方法一、误解 一开始我一直以为spring boot默认的包扫描范围是启动类的同级目录和子目录下的Bean。其实正真是与启动类在同个包以及子包下的Bean。 我一直误解了包的概念&#xff0c;包并不是只文件夹&#xff08;文…...

常青科技冲刺A股上市:研发费用率较低,关联方曾拆出资金达1亿元

近日&#xff0c;江苏常青树新材料科技股份有限公司&#xff08;下称“常青科技”或“常青树科技”&#xff09;递交招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;常青科技计划募资8.50亿元&#xff0c;光大证券为其保荐机构。 据招股书介绍&…...

【Linux】工具(1)——yum

好久不见&#xff0c;让大家久等啦~最近开学被一系列琐事所耽误了&#xff0c;接下来会进入稳定更新状态~话不多说&#xff0c;在我们了解Linux基本内容之后&#xff0c;我们的目的是要在Linux环境下进行软硬件开发&#xff0c;在这个过程中我们会用到一系列工具&#xff0c;例…...

MySQL - 排序与分页

目录1. 排序1.2 排序规则1.2 单列排序1.3 多列排序2. 分页2.1 实现规则1. 排序 1.2 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;&#xff1a;升序DESC&#xff08;descend&#xff09;&#xff1a;降序 ORDER BY 子句在SELECT语句的结尾。 1.2 单列…...

自动化测试框架对比

Robot Framework&#xff08;RF&#xff09; 链接&#xff1a;http://robotframework.org/ Robot Framework&#xff08;RF&#xff09;是用于验收测试和验收测试驱动开发&#xff08;ATDD&#xff09;的自动化测试框架。 基于 Python 编写&#xff0c;但也可以在 Jython&…...