Delphi编程重新设置其他程序的Label内容

减小字体 增大字体 作者:佚名  来源:转载  发布时间:2011-02-18 12:48:13

{  
    程序名   : 重新设定指定Label的内容
    说明     : 无
    作者     : JJony
    QQ       : 254706028
    博客     : http://blog.csdn.net/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:=TextOutANext(DC, X, Y, PShare^.NewCaption, sizeof(PShare^.NewCaption));
    end
   else
    result:=TextOutANext(DC, X, Y, str, Count);
end;

function TextOutWCallBack(DC: HDC; X, Y: Integer; Str: PWideChar; Count: Integer): BOOL; stdcall;
var
 np:widestring;
begin
   np:=strpas(PShare^.NewCaption);
   if widechartostring(str)=strpas(PShare^.OldCaption) then
    result:=TextOutWNext(DC, X, Y,Pwidechar(np), length(np))
   else
    result:=TextOutWNext(DC, X, Y,str, Count);
end;

function DrawTextACallBack(hDC: HDC; lpString: PAnsiChar; nCount: Integer; var lpRect: TRect; uFormat: UINT): Integer;

stdcall;
begin
if strpas(lpString)=strpas(PShare^.OldCaption) then
   result:=DrawTextANext(hDC, PShare^.NewCaption, sizeof(PShare^.NewCaption), lpRect, uFormat)
else
   result:=DrawTextANext(hDC, lpString, ncount, lpRect, uFormat)
end;

function DrawTextWCallBack(hDC: HDC; lpString: PWideChar; nCount: Integer; var lpRect: TRect; uFormat: UINT): Integer;

stdcall;
var
 np:widestring;
begin
   np:=strpas(PShare^.NewCaption);
   if widechartostring( lpString)=strpas(PShare^.OldCaption) then
   result:=DrawTextWNext(hDC, pwidechar(np), length(np), lpRect, uFormat)
   else
    result:=DrawTextWNext(hDC,lpString, nCount, lpRect, uFormat)
end;

begin
  MapHandle := OpenFileMapping(FILE_MAP_WRITE, //打开内存映射为了与主程序共享数据
    False,
    pchar('MyShareMem'));
  PShare := PShareMem(MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0));
  if PShare = nil then
  begin
    CloseHandle(MapHandle);
    exit;
  end;
FillChar(PShare^, SizeOf(TShareMem), 0);
//以下为Hook相关API,分ASNI和UNICODE版本
HookAPI('Gdi32.dll','TextOutA',@TextOutACallBack,@TextOutANext);
HookAPI('Gdi32.dll','TextOutW',@TextOutWCallBack,@TextOutWNext);
HookAPI('User32.dll','DrawTextA',@DrawTextACallBack,@DrawTextANext);
HookAPI('User32.dll','DrawTextW',@DrawTextWCallBack,@DrawTextWNext);
end.

[1] [2]  下一页

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

广告位置B