来自user32.dll的delphi Hook SetClipboardData [英] delphi Hook SetClipboardData from user32.dll

查看:167
本文介绍了来自user32.dll的delphi Hook SetClipboardData的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个组件,我想在DLL中使用它来实现系统范围的钩子:

i've this component that i want to use it in a DLL to achieve a system-wide hook :

unit ClipboardHook;

interface

uses
  Windows, SysUtils, Classes, ExtCtrls;

type
 TFOnOpenClipboard = procedure(Sender:TObject; hWndNewOwner:HWND; 
   var opContinue:Boolean) of object;
 TFOnSetClipboardData = procedure(Sender:TObject; hWndNewOwner:HWND; 
   uFormat:DWord; hMem:THandle; var opContinue:Boolean) of object;

type
  TClipboardHook = class(TComponent)
  private
    { Private declarations }
    FOnOpenClipboard:TFOnOpenClipboard;
    FOnSetClipboardData:TFOnSetClipboardData;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    //------------------------------------------------
  published
    { Published declarations }
    property OnOpenClipboard:TFOnOpenClipboard 
      read FOnOpenClipboard write FOnOpenClipboard;
    property OnSetClipboardData:TFOnSetClipboardData 
      read FOnSetClipboardData write FOnSetClipboardData;
  end;

implementation

type
  TcOpen=function(hWndNewOwner:HWND):Bool; stdcall;

  TscData=function(uFormat:DWord; hMem:Thandle):THandle; stdcall;

  TOP_H = packed record
    Push:Byte;
    Address:DWord;
    Ret:Byte;
  end; 

var 
  OC_Addr,SCD_Addr:Pointer;
  OP:DWord;
  cOpen,rcOpen,scData,rscData:TOP_H;
  WPM:DWord;
  sComponent:TObject;

{***************************Start:TClipboardHook***************************}
function Open_Clipboard(hWndNewOwner:HWND):Bool; stdcall;
var 
  c: Boolean;
begin
  c:=true;
  if Assigned(TClipboardHook(sComponent).FOnOpenClipboard) then
    TClipboardHook(sComponent).FOnOpenClipboard(sComponent,hWndNewOwner,c);
  if c then
  begin
    WriteProcessMemory(OP,OC_Addr,@rcOpen,SizeOf(rcOpen),WPM);
    Result:=TcOpen(OC_Addr)(hWndNewOwner);
    WriteProcessMemory(OP,OC_Addr,@cOpen,SizeOf(cOpen),WPM);
  end 
  else 
    Result:=false;
end;

function Set_ClipboardData(uFormat:DWord; hMem:THandle):THandle; stdcall;
var 
  c: Boolean;
  Win: DWord;
begin         
  c := true;
  Win := GetOpenClipboardWindow();
 if (Win <> 0) and 
    (Assigned(TClipboardHook(sComponent).FOnSetClipboardData)) then
   TClipboardHook(sComponent).FOnSetClipboardData(sComponent,Win,uFormat,hMem,c);
 if c then
 begin
   WriteProcessMemory(OP,SCD_Addr,@rscData,SizeOf(rscData),WPM);
   Result:=TscData(SCD_Addr)(uFormat,hMem);
   WriteProcessMemory(OP,SCD_Addr,@scData,SizeOf(scData),WPM);
 end 
 else 
   Result:=0;
end;

{****************************End:TClipboardHook****************************}
{##############################################################################}
constructor TClipboardHook.Create(AOwner:TComponent);
var 
  Dll: DWord;
begin
  inherited Create(Aowner);
  if (csDesigning in ComponentState) then 
    exit;
  sComponent:=Self;
  DLL := LoadLibrary('user32.dll');
  if DLL <> 0 then
  begin
    OC_Addr := GetProcAddress(DLL,'OpenClipboard');
    SCD_Addr := GetProcAddress(DLL,'SetClipboardData');
    if (OC_Addr <> nil) or (SCD_Addr <> nil) then
    begin      
      OP:=OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
      if OP <> 0 then
      begin
        if OC_Addr <> nil then
        begin
          cOpen.Push := $68;
          cOpen.Address := DWord(@Open_Clipboard);
          cOpen.Ret := $C3;
          ReadProcessMemory(OP, OC_Addr, @rcOpen, SizeOf(rcOpen), WPM);
          WriteProcessMemory(OP, OC_Addr, @cOpen, SizeOf(cOpen), WPM);
        end;
        if SCD_Addr <> nil then
        begin
          scData.Push := $68;
          scData.Address := DWord(@Set_ClipboardData);
          scData.Ret := $C3;
          ReadProcessMemory(OP, SCD_Addr, @rscData, SizeOf(rscData), WPM);
          WriteProcessMemory(OP, SCD_Addr, @scData, SizeOf(scData), WPM);
        end;
      end;
    end;
   FreeLibrary(Dll);
  end;
end;

destructor TClipboardHook.destroy;
begin
 if (OC_Addr <> nil) then 
   WriteProcessMemory(OP, OC_Addr, @rcOpen, SizeOf(rcOpen), WPM);
 if OP <> 0 then CloseHandle(OP);
 inherited destroy;
end;

{##############################################################################}
end.

有人可以帮助我将所有这些内容放入DLL中(没有Component),我的意思是功能。

can someone help me in putting all these stuffs into a DLL ( without the Component ) ,i mean only the functions .

非常感谢

推荐答案

您可以简单地通过包含一个 exports 子句在您单位的某个位置。要导出该代码中的两个函数,请将其添加到单元的底部:

You can export functions simply by including an exports clause somewhere in your unit. To export the two functions in that code, add this at the bottom of your unit:

exports
  Open_Clipboard,
  Set_ClipboardData;

这篇关于来自user32.dll的delphi Hook SetClipboardData的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆