2012-04-13 7 views
2

Ich habe diese Komponente, die ich will es in einer DLL verwenden, um eine systemweite Haken zu erreichen:delphi Haken SetClipboardData von user32.dll

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. 

kann mir jemand helfen, all diese Stoffe in eine bei der Umsetzung DLL (ohne die Komponente), ich meine nur die Funktionen.

vielen Dank

+0

Sie möchten nicht die Komponente in der DLL? –

+0

Ohne die Komponente wird der Code nichts tun. Außerdem hatte ich den Eindruck, dass es System-APIs gibt, mit denen Sie die Zwischenablage haken können, ohne dass Sie furchtbare Hacks wie diese verwenden müssen. –

+0

@David, können Sie mir bitte diese System-APIs sagen? – randydom

Antwort

1

Sie können in Ihrem Gerät, indem eine exports Klausel irgendwo Funktionen einfach exportieren. Um die beiden Funktionen in diesem Code zu exportieren, fügen Sie diese unten auf Ihrem Gerät hinzu:

exports 
    Open_Clipboard, 
    Set_ClipboardData; 
+1

Das beantwortet die Frage, die gestellt wurde, aber die falsche Frage wurde gestellt. –

+0

Lustig, wie oft das passiert, @David. Es ist schwer zu lehren, wie man Probleme analysiert, um die richtigen Fragen zu stellen. –

Verwandte Themen