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
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
函数是干什么的,我查了好多资料都没有结果,谢谢了。
RtlMoveMemory
函数是干什么的,我查了好多资料都没有结果,谢谢了。
#8
我想, mornlena(MoRn)说的hWndNow 参数可能就是你要取得的标签所在的窗体的句柄。你试了吗?
#9
SendMessage只能取得有句柄的控件上的内容。
#10
label的文字是好象不是画上去的,如果是画上去的,金山词霸也读不出来,金山词霸能读出来,就不是画上去的。
#11
//RtlMoveMemory
该函数用于内存拷贝
该函数用于内存拷贝
#12
Label就是系统画在界面上的,Label根本没有Hwnd(句柄)
#13
kissoflife(明月高楼休独倚,酒入愁肠,化作相思泪!) 说的对,SendMessage只能取得有句柄的控件上的内容,我说只能读取有编辑能力的控件上的内容太片面了,向大家道歉。(我说的话能相信吗?)
一楼的hebhd(汉德)说的也对,label控件的内容只能用屏幕取词的方法。mornlena(MoRn) 给的函数之所以读不出来,可能是因为楼主想要读内容的控件的句柄不对,或者那个控件根本没有句柄。屏幕取词虽然没有WM_GETTEXT用起来方便,但实际写出来的屏幕取词的代码并不长,也不是太难,我只能在网吧上,没有办法帖出来,对不起。
一楼的hebhd(汉德)说的也对,label控件的内容只能用屏幕取词的方法。mornlena(MoRn) 给的函数之所以读不出来,可能是因为楼主想要读内容的控件的句柄不对,或者那个控件根本没有句柄。屏幕取词虽然没有WM_GETTEXT用起来方便,但实际写出来的屏幕取词的代码并不长,也不是太难,我只能在网吧上,没有办法帖出来,对不起。
#14
办法是有了,那就是设置钩子,在输出lable的函数 Textout 执行之前就把当中的参数取下了,那就可以完成了,可是这有点麻烦,我还没完成呢,哪位有现成的代码请不要吝啬,共享一下吧,谢谢了
#15
没有句柄就是讨厌
#16
还没答案啊,看来真是个高难问题哦~
我就搞不懂了,label没有句柄,但我想,label中的文本是存放在什么地方的呢?在程序(自己的)运行时,我们可以随时取得label的文本,那么可以这么理解,虽然label上的文本是画上去的,但内存中的另一个地方也可能存放着与之相同的文本吧,要不我们在自己的程序中读label的文本岂不是系统要把画上去的内容经过类似OCR的技术翻译成文本再返回给我们?所以我想label文本应该以另一种方式(类似于变量?)存放在某个地方,如果找到了这个地方(内存地址?),就可以轻易的得到label的文本
瞎说的:)
期待高手的回答
我就搞不懂了,label没有句柄,但我想,label中的文本是存放在什么地方的呢?在程序(自己的)运行时,我们可以随时取得label的文本,那么可以这么理解,虽然label上的文本是画上去的,但内存中的另一个地方也可能存放着与之相同的文本吧,要不我们在自己的程序中读label的文本岂不是系统要把画上去的内容经过类似OCR的技术翻译成文本再返回给我们?所以我想label文本应该以另一种方式(类似于变量?)存放在某个地方,如果找到了这个地方(内存地址?),就可以轻易的得到label的文本
瞎说的:)
期待高手的回答
#17
呵呵,bluebeer想法是没有错,只是问题就在于没有什么可能在茫茫的内存海洋中找到你要的文本。因此,目前来看只有api hook才是可行之道
#18
哦~
#19
高难问题!
API Hook的经典例子就是这个了。VB好像希望不大吧,连函数指针都没有,难……而且对全局内存操作的话……
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 :数据的字节数
函数是干什么的,我查了好多资料都没有结果,谢谢了。
=============================
是用来复制数据的,声明:
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
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
函数是干什么的,我查了好多资料都没有结果,谢谢了。
RtlMoveMemory
函数是干什么的,我查了好多资料都没有结果,谢谢了。
#8
我想, mornlena(MoRn)说的hWndNow 参数可能就是你要取得的标签所在的窗体的句柄。你试了吗?
#9
SendMessage只能取得有句柄的控件上的内容。
#10
label的文字是好象不是画上去的,如果是画上去的,金山词霸也读不出来,金山词霸能读出来,就不是画上去的。
#11
//RtlMoveMemory
该函数用于内存拷贝
该函数用于内存拷贝
#12
Label就是系统画在界面上的,Label根本没有Hwnd(句柄)
#13
kissoflife(明月高楼休独倚,酒入愁肠,化作相思泪!) 说的对,SendMessage只能取得有句柄的控件上的内容,我说只能读取有编辑能力的控件上的内容太片面了,向大家道歉。(我说的话能相信吗?)
一楼的hebhd(汉德)说的也对,label控件的内容只能用屏幕取词的方法。mornlena(MoRn) 给的函数之所以读不出来,可能是因为楼主想要读内容的控件的句柄不对,或者那个控件根本没有句柄。屏幕取词虽然没有WM_GETTEXT用起来方便,但实际写出来的屏幕取词的代码并不长,也不是太难,我只能在网吧上,没有办法帖出来,对不起。
一楼的hebhd(汉德)说的也对,label控件的内容只能用屏幕取词的方法。mornlena(MoRn) 给的函数之所以读不出来,可能是因为楼主想要读内容的控件的句柄不对,或者那个控件根本没有句柄。屏幕取词虽然没有WM_GETTEXT用起来方便,但实际写出来的屏幕取词的代码并不长,也不是太难,我只能在网吧上,没有办法帖出来,对不起。
#14
办法是有了,那就是设置钩子,在输出lable的函数 Textout 执行之前就把当中的参数取下了,那就可以完成了,可是这有点麻烦,我还没完成呢,哪位有现成的代码请不要吝啬,共享一下吧,谢谢了
#15
没有句柄就是讨厌
#16
还没答案啊,看来真是个高难问题哦~
我就搞不懂了,label没有句柄,但我想,label中的文本是存放在什么地方的呢?在程序(自己的)运行时,我们可以随时取得label的文本,那么可以这么理解,虽然label上的文本是画上去的,但内存中的另一个地方也可能存放着与之相同的文本吧,要不我们在自己的程序中读label的文本岂不是系统要把画上去的内容经过类似OCR的技术翻译成文本再返回给我们?所以我想label文本应该以另一种方式(类似于变量?)存放在某个地方,如果找到了这个地方(内存地址?),就可以轻易的得到label的文本
瞎说的:)
期待高手的回答
我就搞不懂了,label没有句柄,但我想,label中的文本是存放在什么地方的呢?在程序(自己的)运行时,我们可以随时取得label的文本,那么可以这么理解,虽然label上的文本是画上去的,但内存中的另一个地方也可能存放着与之相同的文本吧,要不我们在自己的程序中读label的文本岂不是系统要把画上去的内容经过类似OCR的技术翻译成文本再返回给我们?所以我想label文本应该以另一种方式(类似于变量?)存放在某个地方,如果找到了这个地方(内存地址?),就可以轻易的得到label的文本
瞎说的:)
期待高手的回答
#17
呵呵,bluebeer想法是没有错,只是问题就在于没有什么可能在茫茫的内存海洋中找到你要的文本。因此,目前来看只有api hook才是可行之道
#18
哦~
#19
高难问题!
API Hook的经典例子就是这个了。VB好像希望不大吧,连函数指针都没有,难……而且对全局内存操作的话……
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 :数据的字节数
函数是干什么的,我查了好多资料都没有结果,谢谢了。
=============================
是用来复制数据的,声明:
Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
其中:
lpvDest:目的数据的地址
lpvSource :来源数据的地址
cbCopy :数据的字节数