当前位置: BOLT界面引擎 > 知识库文章 > BOLT引擎全局文本HOOK

BOLT引擎全局文本HOOK

作者:李亚星 2013-05-09

 

BOLT引擎提供全局文本HOOK,可以截获所有动态设置到引擎里面的文本,用以统计、修改、替换文本等功能,产品也可以依据该功能实现国际化等需求

 

文本HOOK涉及下面元对象和hostwnd的文本设置方法:

l  TextObject

n  SetText

n  SetTextID

l  EditObject

n  ReplaceSel

n  AppendText

n  InsertText

n  SetText

l  RichEditObject

n  ReplaceSel

n  AppendText

n  InsertText

n  SetText

l  HostWnd(所有hostwnd类型)

n  SetTitle

 

当外部调用上述方法来修改内部文本时候(包括XAR里面的xml解析过程产生的调用),会通过文本HOOK的回调来给一个外部通知,外面可以在回调通知里面做自己需要的处理操作

 

C层的接口(接口定义在<XLUE.h>)

回调函数定义如下:

typedef long (XLUE_STDCALL* LPFNTEXTCHANGEHOOK)(const XLUE_HOOK_DESC* lpHookDesc, wchar_t* lpstrTextBuffer,  long textLen, long* lpTextBufferLen,   BOOL* lpCallNext);

 

其中回调方法的参数说明如下:

l  lpHookDesc关于该次hook的附加信息

l  lpstrTextBuffer 包含当前文本内容的buffer,外部可以根据需要进行修改

l  textLen文本的长度,也即字符个数

l  lpTextBufferLen指向当前文本缓冲区的大小,也即lpstrTextBuffer指向的缓冲区的字节数

l  lpCallNext是否调用下一个hook,默认为TRUE

 

XLUE_HOOK_DESC里面提供了当前文本hook回调的详细描述信息,字段含义如下:

l  userData XLUE_SetGlobalHook传入的用户自定义参数

l  obj 当前触发该hook的元对象或者hostwnd句柄

l  lpObjType 当前触发该hookobj类型,对于元对象,会是TextObject/EditObject等,对于hostwnd,会是FrameHostWnd/ModalHostWnd

l  lpEventName 当前触发该hook的事件类型,在上面的列表里面有详细描述

 

需要注意的是:

l  文本编码是基于unicode的,所以外面修改后的文本也要基于unicode编码

l  文本是以\0结束的字符串

l  textlen给出了textbuffer里面的文本长度,也即unicode字符个数

l  textbufferlen给出了textbuffer缓冲区的长度,基于字节的

 

如果lpTextBufferLen指定的当前缓冲区长度不够(修改后的文本变长了),那么在textbufferlen里面指定需要的长度即可,ue内部会重新申请足够长度的buffer,然后再次调用该接口;如果缓冲区长度足够的话那么可以直接修改文本,切记不要缓冲区越界!

 

安装和移除HOOK方法如下:

XLUE_API(long) XLUE_SetGlobalHook(unsigned long type, void* lpHookProc, void* userData, unsigned long flags, BOOL hookBack);

XLUE_API(BOOL) XLUE_RemoveGlobalHook(long cookie);

 

其中参数说明如下:

l  type指定了需要安装什么类型的hook,目前公开的只有文本HOOK,也即XLUE_HOOK_TEXTCHANGE

l  lpHookProc hook回调函数

l  userData 用户自定义data,这个会在hook回调函数里面的lpHookDesc结构体里面提供

l  flags 暂时未使用,保留参数

l  hookBack 挂载hook到最前还是最后

 

Lua层的接口如下:

lua层的接口使用起来更为简单,不需要考虑缓冲区大小问题,所以更推荐使用lua接口来操作hook

 

引擎提供了一个全局对象Xunlei.UIEngine.GlobalHook来在lua里面完成对应的操作,接口如下:

 

设置和移除hooklua方法:

long SetGlobalHook(long type, function hookProc, long flags, bool pushBack)

bool RemoveGlobalHook(long cookie)

 

lua回调函数:

long ret, string retValue, bool callNext OnTextChange(table hookDesc, string text)

其中hookDesc里面包含了XLUE_HOOK_DESC的对应字段值:

l  eventname 对应XLUE_HOOK_DESClpEventName字段

l  objtype 对应XLUE_HOOK_DESClpObjType字段

l  obj 对应XLUE_HOOK_DESCobj字段

text 参数指示了当前的文本内容

 

返回值:

l  ret 标准返回值,返回0表示需要接受retValue值为新的字符串值;返回非0表示忽略此次调用

l  retValue 修改后的字符串值,长度可以比源字符串长

l  callNext 是否调用下一个hook,默认为true

 

下面是一段实例代码:

local globalHook = XLGetObject("Xunlei.UIEngine.GlobalHook")

                                              

local function OnTextChange(desc, text)

         text = text.."abc"

         return 0, text, true

end

                                                       

local cookie = globalHook:SetGlobalHook(0x01, OnTextChange, 0, true)

……

globalHook:RemoveGlobalHook(cookie)

 

 

迅雷公司 版权所有 Copyright 2003-2010 Thunder Inc.All Rights Reserved. 意见反馈:xl7doc@xunlei.com