屏幕取词 hook ExtTextOutW、BitBlt函数,如何获得文本正确的设备坐标

mwj09 2010-09-19 05:02:37
通过hook ExtTextOutW、BitBlt函数,已经可以获得文本和对应的设备坐标,
( hook BitBlt获得内存DC(SrcHdc),通过 LPTODP(SrcHdc,&point)获得设备坐标。)

但有些窗口好像是分区显示的,获得的坐标有一部分是准确的,另一部分坐标,不是以窗口左上角为原点的坐标,请问,这一部分的设备坐标如何获得?







第一次发帖,请多多支持,谢谢~
...全文
580 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlin_0 2012-06-17
  • 打赏
  • 举报
回复
请问搂主问题解决了吗?对于windows命令模式下(cmd窗口)有效吗?

mwj09 2010-09-21
  • 打赏
  • 举报
回复
up~~~~~~~~~~~~~
mwj09 2010-09-21
  • 打赏
  • 举报
回复
up~~~~~~~~~~~~~
mwj09 2010-09-21
  • 打赏
  • 举报
回复
weiym:

请问,如何确认Bitblt的起始坐标是不是一致的?

我在HOOK BitBlt函数中,将取到的字符串的坐标打印出来了,目标矩形的左上角坐标打出来都是(0,0),源位图左上角坐标各不相同,不知道怎么去比较一致不一致。


我当前的情况再说一下,HOOK了ExtTextOutW和BitBlt函数,取到了想要的字符串和对应的逻辑坐标。
我用LPTODP(hdcSrc,逻辑坐标)转换,得到设备坐标有部分不正确,不能区分各字符串的位置。

能解说的再详细具体一些吗?非常感谢~~
weiym 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mwj09 的回复:]
weiym:

我已经通过HOOK Bitblt获得了内存DC(Srchdc);

刚刚试了一下WindowFromDC,GetCurrentObject,请问这两个参数用到的都是内存DC吗?

获得了当前Bitmap后,如何取得正确的设备坐标?谢谢~
[/Quote]
搞这个东西,首先你要明白绘画文本方式,可能是直接在窗口DC上用DrawText等API画,也可能是用先把文本画到内存DC上,然后再BitBlt到你的目标窗口DC上。

所以你要用WindowFromDC来判断,如果句柄就是你的目标窗口,那他是直接画的;如果返回的是0, 那他是先画在内存DC上,然后你就要跟踪这个内存DC有没有通过BitBlt等API拷贝到目标窗口DC上。
mwj09 2010-09-20
  • 打赏
  • 举报
回复
up~~~~~~~~~~~~~~~~~~
mwj09 2010-09-20
  • 打赏
  • 举报
回复

急着解决,高手指点一下啊~
mwj09 2010-09-20
  • 打赏
  • 举报
回复
weiym:

我已经通过HOOK Bitblt获得了内存DC(Srchdc);

刚刚试了一下WindowFromDC,GetCurrentObject,请问这两个参数用到的都是内存DC吗?

获得了当前Bitmap后,如何取得正确的设备坐标?谢谢~
weiym 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mwj09 的回复:]
weiym,您好!

已确定是先画在DC上,再拷贝到目标DC上的

我现在做的工作是从窗口上提取坐标及文本(屏幕取词)

文本已经得到正确的,只是对应的坐标有部分正确(通过LPTODP,ClientTOScreen),另一部分坐标也通过前面两个函数转换,但坐标不正确,两部分原点不是同一点,不知道该如何判断。

我接触WINDOWS程序设计时间比较短,有说错的地方,请……
[/Quote]

看下Bitblt的起始坐标是不是一致,LPTODP转换坐标应该就够了
weiym 2010-09-20
  • 打赏
  • 举报
回复
注意如果窗口没有CS_OWNDC风格,同一个DC可能会被不同的窗口先后使用, 另外有些控件不是在WM_PAINT里画的文字
weiym 2010-09-20
  • 打赏
  • 举报
回复
前不久刚好因为工作需要玩过这个技术,分享下:你需要Hook所有的DrawText函数,一个窗口对应多个DC,用WindowFromDC判断是不是目标窗口,内存DC调用WindowFromDC返回0, 一个DC可能有多个Bitmap,用GetCurrentObject(hdcSrc,OBJ_BITMAP)获取当前Bitmap, 一个Bitmap可能有多次DrawText, 同时你要Hook所有的位图拷贝函数(BitBlt, TransparentBlt等)及坐标的转换,这样你才能知道目标窗口画了哪些东西.
参考帖子http://topic.csdn.net/u/20100902/22/2a469778-80a9-464d-85e8-42d5d0e92d3a.html
向立天 2010-09-20
  • 打赏
  • 举报
回复
另一部分坐标,不是以窗口左上角为原点的坐标,请问,这一部分的设备坐标如何获得
================
这一部分也一定有自己的输出窗口
只要你确定这个窗口就可以了
mwj09 2010-09-20
  • 打赏
  • 举报
回复
得不到正确的设备坐标,如何转屏幕坐标?
mwj09 2010-09-20
  • 打赏
  • 举报
回复
up~~~~~~~~~~~~~~~
mwj09 2010-09-20
  • 打赏
  • 举报
回复
up~~~~~~~~~~~~~~
mwj09 2010-09-20
  • 打赏
  • 举报
回复
能发我一下吗?谢谢!
mwj09@163.com
babala2009 2010-09-20
  • 打赏
  • 举报
回复
手上有一套类似的代码
mwj09 2010-09-20
  • 打赏
  • 举报
回复
weiym,您好!

已确定是先画在DC上,再拷贝到目标DC上的

我现在做的工作是从窗口上提取坐标及文本(屏幕取词)

文本已经得到正确的,只是对应的坐标有部分正确(通过LPTODP,ClientTOScreen),另一部分坐标也通过前面两个函数转换,但坐标不正确,两部分原点不是同一点,不知道该如何判断。

我接触WINDOWS程序设计时间比较短,有说错的地方,请见谅,谢谢!
永远的明日 2010-09-19
  • 打赏
  • 举报
回复
ClientToScreen()
mwj09 2010-09-19
  • 打赏
  • 举报
回复
有高手指点一下啊,谢谢~~~
加载更多回复(4)
内容概要:本文围绕“空地多无人平台协同路径规划技术”的论文复现展开,重点介绍了基于Matlab的多无人机与地面无人平台协同路径规划的算法实现与仿真研究。研究系统性地整合了无人机三维路径规划、动态避障、多机协同、任务分配及防撞机制等核心技术,结合智能优化算法(如遗传算法、粒子群算法、灰狼优化算法等)与经典路径规划模型(如Dubins路径、A*、RRT等),在复杂威胁环境下实现了高效、安全的协同路径规划。文中提供了完整的Matlab代码支持,便于科研人员进行算法验证、性能对比与二次开发,并强调通过复现高水平学术论文(如EI、SCI期刊及硕博论文)深入掌握该领域的前沿方法与技术路线。; 适合人群:具备一定Matlab编程基础,从事无人机系统、自动化控制、人工智能、路径规划等相关领域研究的研究生、科研人员及工程技术人员,尤其适用于正在开展科研项目、撰写学位论文或希望提升算法实践能力的研究者。; 使用场景及目标:① 复现并深入理解空地协同路径规划领域的高水平论文算法;② 掌握Matlab在多智能体路径规划中的建模、仿真与可视化方法;③ 应用于科研课题、毕业设计、项目申报及算法创新实践中,提升研究的技术深度与工程可行性。; 阅读建议:建议结合文中提供的网盘资源(含完整代码、仿真模型及参考文献资料)同步学习,优先选择与自身研究方向契合的案例进行复现,注重算法原理与代码实现之间的映射关系,并在掌握基础方案后尝试进行参数调优、算法融合或引入新约束条件以实现改进与创新。

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧