100分:奇怪的子类,奇怪的WM_GETTEXT……
目标:在BHO中想获取IE地址栏的输入情况以方便快捷输入。
我的方法是子类化地址栏,子类是实现了,但无法获取其文本。
在VB6程序中测试如下:
Private Const WM_SETTEXT = &HC
Private Const WM_GETTEXT = &HD
Private Declare Function SendMessageByVal Lib "user32 " Alias "SendMessageA " (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As String) As Long
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Dim mStr As String
mStr = String(255, Chr$(0))
If KeyCode = 13 Then
SendMessageByVal Text1.hWnd, WM_GETTEXT, ByVal 255, mStr
mStr = Left(mStr, InStr(1, mStr, Chr$(0)) - 1)
If mStr = "126m " Then
Text2.Text = "www.126.com "
End If
End If
End Sub
在Text1中输入输入126m,回车,可以看到Text2.Text = "www.126.com "。那证明这个代码是没问题的。
但是在地址栏的子类处理中,获取到WM_KEYUP的时候尝试SendMessageByVal m_AddWnd, WM_GETTEXT, ByVal 255, mStr却导致IE崩溃!!
于是我怀疑是IE处理了WM_GETTEXT消息。但用SPY++是可以获得其文本的,那真是奇怪了,是什么原因呢?
当然,也许是我的方法不对,但不用子类用什么呢?(不想在BeforeNavigate2里面处理)
谢谢。
[解决办法]
记得在豆子的一篇文章里说到那个提示栏的问题
说是多线程引起的
也许LZ的问题也是这个....
你试下在HOOK过程里不要使用任何COM对象看看.....
[解决办法]
LZ把问题想简单了!
这是跨进程处理,你传入本进程的字符串地址,让另一进程的窗口处理过程去写入,当然会非法操作!
正确的办法是要在目标进程中申请一块内存,再用SendMessage把那个地址传过去,然后你再读那个内存取得Text。
手头没例子,你自己找找吧。
[解决办法]
最好是共享内存传回 数据 用CreateMap
[解决办法]
//用版主的办法,即使实现了只能实例化一次,那也无法得到当前页面的IE
不是这样的,我的意思是说,你把子类单独放在一个class中,这个class只干子类处理这个活,这个class是Singleton的,不会影响到其它的东西