{
程序名 : 重新设定指定Label的内容
说明 : 无
作者 : JJony
QQ : 254706028
博客 : http://blog.youkuaiyun.com/jzj_jony
空间 : http://jonychen,ys168.com
测试环境 : WinXPSP2+Delphi7+MadCodeHook控件
}
程序说明:
程序通过钩子重新设定指定Label的显示内容。
使用说明:
运行主程序,输入你要改变的Label所属进程PID,点“注入dll”按钮,
然后输入你要改的Label的原内容,再输入你想改的内容,点“设置”按钮,
最小化目标程序再还原,你就可以看到效果了。
声明:
你可以任意使用或转载程序,但请注明作者,谢谢。
今天在大富翁看到一个帖子,说是不知道怎么重新设定其他程序中Label的内容,我起初拿来一看
感觉就是太容易了嘛!结果我错了,因为Label没有句柄,没有句柄当然就无法设置了,经过我的研究
发现,Label并不是用CreateWindow建立的窗体,而是直接用TextOut或DrawText直接在窗体上画出的,
这也是为什么我在使用说明中说“最小化目标程序再还原”的原因了,因为这两个API是在窗体重画时
才调用的,你也可以用别的窗口把他挡住然后在移开,也会看到同样效果的。知道了问题关键就好解决
了,既然是用TextOut或DrawText那我们就挂钩这两个API就好了,马上动手。
//Hook.dll的源代码
library Hook;
uses
windows,
SysUtils,
Classes,
madcodehook;//很强大的组件HookAPI用,可以从http://madshi.net下载
{$R Ver.RES}
//内存共享结构
type
PShareMem = ^TShareMem;
TShareMem = record
OldCaption: array[0..255] of char;//原始Label的Caption
NewCaption: array[0..255] of char;//想要显示的Caption
end;
var
PShare: PShareMem;
MapHandle: THandle;
var //定义相关API,分ANSI和UNICODE版本
TextOutANext:function(DC: HDC; X, Y: Integer; Str: PAnsiChar; Count: Integer): BOOL; stdcall;
TextOutWNext:function(DC: HDC; X, Y: Integer; Str: PWideChar; Count: Integer): BOOL; stdcall;
DrawTextANext:function(hDC: HDC; lpString: PAnsiChar; nCount: Integer; var lpRect: TRect; uFormat: UINT): Integer; stdcall;
DrawTextWNext:function(hDC: HDC; lpString: PWideChar; nCount: Integer; var lpRect: TRect; uFormat: UINT): Integer; stdcall;
function TextOutACallBack(DC: HDC; X, Y: Integer; Str: PAnsiChar; Count: Integer): BOOL; stdcall;
begin
if strpas(str)=strpas(PShare^.OldCaption) then
begin
result:=Text