如何获取其它窗口上Label控件的caption 属性值?急用!!

时间:2022-03-24 14:38:00
我可以用Sendmessage 函数获取其它任何控件的内容(包括密码),但就是取不了Label控件的,哪位大虾能指点迷津,本人不胜感激!!

21 个解决方案

#1


不用找了。只有一个办法。屏幕取词。实现起来难上加难

#2


看来得求取金山词霸的技术了,哎!

#3


label的文字是画上去的

#4


9494

#5


试试这个函数

Function GetText(ByVal hWndNow As Long) As String
Dim hLength As Long, sLength As Long
Dim bArr() As Byte, bArr2() As Byte
hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
If hLength > 0 Then
   ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
   Call RtlMoveMemory(bArr(0), hLength, 2)
   Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
   Call RtlMoveMemory(bArr2(0), bArr(0), hLength)
   GetText = StrConv(bArr2, vbUnicode)
Else
   GetText = ""
End If
End Function

#6


mornlena(MoRn) 的办法也不好使,参数 hWndNow 无法取得,不过还是谢谢你

#7


我也在为这个问题发愁呢,都快急死了。用SendMessage发WM_GETTEXT消息只能取得有编辑能力的文本框的内容,不能取得象label这样的东西的文本。另外,用鼠标取词的思想是可以实现,请mornlena(MoRn)告诉大家
RtlMoveMemory
函数是干什么的,我查了好多资料都没有结果,谢谢了。

#8


我想, mornlena(MoRn)说的hWndNow 参数可能就是你要取得的标签所在的窗体的句柄。你试了吗?

#9


SendMessage只能取得有句柄的控件上的内容。

#10


label的文字是好象不是画上去的,如果是画上去的,金山词霸也读不出来,金山词霸能读出来,就不是画上去的。

#11


//RtlMoveMemory
该函数用于内存拷贝

#12


Label就是系统画在界面上的,Label根本没有Hwnd(句柄)

#13


kissoflife(明月高楼休独倚,酒入愁肠,化作相思泪!) 说的对,SendMessage只能取得有句柄的控件上的内容,我说只能读取有编辑能力的控件上的内容太片面了,向大家道歉。(我说的话能相信吗?)
一楼的hebhd(汉德)说的也对,label控件的内容只能用屏幕取词的方法。mornlena(MoRn) 给的函数之所以读不出来,可能是因为楼主想要读内容的控件的句柄不对,或者那个控件根本没有句柄。屏幕取词虽然没有WM_GETTEXT用起来方便,但实际写出来的屏幕取词的代码并不长,也不是太难,我只能在网吧上,没有办法帖出来,对不起。

#14


办法是有了,那就是设置钩子,在输出lable的函数 Textout 执行之前就把当中的参数取下了,那就可以完成了,可是这有点麻烦,我还没完成呢,哪位有现成的代码请不要吝啬,共享一下吧,谢谢了

#15


没有句柄就是讨厌

#16


还没答案啊,看来真是个高难问题哦~


我就搞不懂了,label没有句柄,但我想,label中的文本是存放在什么地方的呢?在程序(自己的)运行时,我们可以随时取得label的文本,那么可以这么理解,虽然label上的文本是画上去的,但内存中的另一个地方也可能存放着与之相同的文本吧,要不我们在自己的程序中读label的文本岂不是系统要把画上去的内容经过类似OCR的技术翻译成文本再返回给我们?所以我想label文本应该以另一种方式(类似于变量?)存放在某个地方,如果找到了这个地方(内存地址?),就可以轻易的得到label的文本

瞎说的:)

期待高手的回答

#17


呵呵,bluebeer想法是没有错,只是问题就在于没有什么可能在茫茫的内存海洋中找到你要的文本。因此,目前来看只有api hook才是可行之道

#18


哦~

#19


高难问题!

API Hook的经典例子就是这个了。VB好像希望不大吧,连函数指针都没有,难……而且对全局内存操作的话……

#20


顺便说一下,Static控件的应该可以吧

#21


RtlMoveMemory
函数是干什么的,我查了好多资料都没有结果,谢谢了。
=============================
是用来复制数据的,声明:
Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

其中:
lpvDest:目的数据的地址
lpvSource :来源数据的地址
cbCopy :数据的字节数



#1


不用找了。只有一个办法。屏幕取词。实现起来难上加难

#2


看来得求取金山词霸的技术了,哎!

#3


label的文字是画上去的

#4


9494

#5


试试这个函数

Function GetText(ByVal hWndNow As Long) As String
Dim hLength As Long, sLength As Long
Dim bArr() As Byte, bArr2() As Byte
hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
If hLength > 0 Then
   ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
   Call RtlMoveMemory(bArr(0), hLength, 2)
   Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
   Call RtlMoveMemory(bArr2(0), bArr(0), hLength)
   GetText = StrConv(bArr2, vbUnicode)
Else
   GetText = ""
End If
End Function

#6


mornlena(MoRn) 的办法也不好使,参数 hWndNow 无法取得,不过还是谢谢你

#7


我也在为这个问题发愁呢,都快急死了。用SendMessage发WM_GETTEXT消息只能取得有编辑能力的文本框的内容,不能取得象label这样的东西的文本。另外,用鼠标取词的思想是可以实现,请mornlena(MoRn)告诉大家
RtlMoveMemory
函数是干什么的,我查了好多资料都没有结果,谢谢了。

#8


我想, mornlena(MoRn)说的hWndNow 参数可能就是你要取得的标签所在的窗体的句柄。你试了吗?

#9


SendMessage只能取得有句柄的控件上的内容。

#10


label的文字是好象不是画上去的,如果是画上去的,金山词霸也读不出来,金山词霸能读出来,就不是画上去的。

#11


//RtlMoveMemory
该函数用于内存拷贝

#12


Label就是系统画在界面上的,Label根本没有Hwnd(句柄)

#13


kissoflife(明月高楼休独倚,酒入愁肠,化作相思泪!) 说的对,SendMessage只能取得有句柄的控件上的内容,我说只能读取有编辑能力的控件上的内容太片面了,向大家道歉。(我说的话能相信吗?)
一楼的hebhd(汉德)说的也对,label控件的内容只能用屏幕取词的方法。mornlena(MoRn) 给的函数之所以读不出来,可能是因为楼主想要读内容的控件的句柄不对,或者那个控件根本没有句柄。屏幕取词虽然没有WM_GETTEXT用起来方便,但实际写出来的屏幕取词的代码并不长,也不是太难,我只能在网吧上,没有办法帖出来,对不起。

#14


办法是有了,那就是设置钩子,在输出lable的函数 Textout 执行之前就把当中的参数取下了,那就可以完成了,可是这有点麻烦,我还没完成呢,哪位有现成的代码请不要吝啬,共享一下吧,谢谢了

#15


没有句柄就是讨厌

#16


还没答案啊,看来真是个高难问题哦~


我就搞不懂了,label没有句柄,但我想,label中的文本是存放在什么地方的呢?在程序(自己的)运行时,我们可以随时取得label的文本,那么可以这么理解,虽然label上的文本是画上去的,但内存中的另一个地方也可能存放着与之相同的文本吧,要不我们在自己的程序中读label的文本岂不是系统要把画上去的内容经过类似OCR的技术翻译成文本再返回给我们?所以我想label文本应该以另一种方式(类似于变量?)存放在某个地方,如果找到了这个地方(内存地址?),就可以轻易的得到label的文本

瞎说的:)

期待高手的回答

#17


呵呵,bluebeer想法是没有错,只是问题就在于没有什么可能在茫茫的内存海洋中找到你要的文本。因此,目前来看只有api hook才是可行之道

#18


哦~

#19


高难问题!

API Hook的经典例子就是这个了。VB好像希望不大吧,连函数指针都没有,难……而且对全局内存操作的话……

#20


顺便说一下,Static控件的应该可以吧

#21


RtlMoveMemory
函数是干什么的,我查了好多资料都没有结果,谢谢了。
=============================
是用来复制数据的,声明:
Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

其中:
lpvDest:目的数据的地址
lpvSource :来源数据的地址
cbCopy :数据的字节数