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

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

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







第一次发帖,请多多支持,谢谢~
...全文
505 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)

15,978

社区成员

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

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