首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

100分:奇怪的子类,奇怪的WM_GETTEXT…解决方法

2012-01-19 
100分:奇怪的子类,奇怪的WM_GETTEXT……目标:在BHO中想获取IE地址栏的输入情况以方便快捷输入。我的方法是子

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的,不会影响到其它的东西


热点排行