首页
社区
课程
招聘
[求助]delphi 消息钩子DLL 问题解决了
发表于: 2009-2-17 22:08 7190

[求助]delphi 消息钩子DLL 问题解决了

2009-2-17 22:08
7190
看了堕落天才大大的文章
转了一个DLL

library testdll;

uses
  SysUtils,
  windows,
  messages,
  Classes;

var
hHk:HHOOK;
hws:longint;
{$R *.res}

function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
begin
  Result:=(CallNextHookEx(hHk,nCode,wParam,lParam));//什么都不需要做
end;

function DllEntryPoint(fdwReason:DWORD):boolean;
var
szFileName:array[0..255] of Char;
begin
if fdwReason=DLL_PROCESS_ATTACH then
    begin
      GetModuleFileName(0,szFileName,256);
      if pos(szFileName,'delphi32.exe')>0then
        SendMessageA(hws,WM_COPYDATA,0,0);
    end

end;

function hookoff():boolean;stdcall;
begin
UnhookWindowsHookEx(hhk);
end;
exports hookoff;

function HookOn(Hwnds:HWND):longint;stdcall;
begin
hws:=Hwnds;
hhk :=SetWindowsHookEx(WH_GETMESSAGE,@GetMsgProc,hInstance,0);
result:=hws;
end;
exports Hookon;

begin
DllProc:=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.

主程序传入 form的句柄

主程序收不到DLL SendMessage的消息

大大们帮忙看看

按xicao大加入共享数据 ,pos(szFileName,'delphi32.exe') 原来调换了
变成pos('delphi32',szFileName) 就可以收到消息

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 243
活跃值: (244)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Form的句柄放到共享节,这样才能跨进程
2009-2-17 22:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在DLL 里加上共享数据 Form的句柄都不行啊

加上的代码:
library testdll;

uses
  SysUtils,
  windows,
  messages,
  Classes;

const
MFileName='ShareData';
type
TShared=record
hws:longint;
end;

PShared=^TShared;

var
hHk:HHOOK;
Shared : PShared;
MemFile:THandle;

{$R *.res}

function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
begin
  Result:=(CallNextHookEx(hHk,nCode,wParam,lParam));//什么都不需要做
end;

procedure Extro;
begin
  UnmapViewOfFile(Shared);
  CloseHandle(MemFile);
end;

procedure DllEntryPoint(fdwReason:DWORD);
var
szFileName:array[0..255] of Char;
begin
if fdwReason=DLL_PROCESS_ATTACH then
    begin
      GetModuleFileName(0,szFileName,256);

      if pos(szFileName,'delphi32.exe')>0then
        SendMessage(Shared^.hws,WM_USER+102,0,0);
    end;

Extro;

end;

function hookoff():boolean;stdcall;
begin
UnhookWindowsHookEx(hhk);
Etro;
end;
exports hookoff;

function HookOn(Hwnds:HWND):longint;stdcall;
begin
Shared^.hws:=Hwnds;
hhk :=SetWindowsHookEx(WH_GETMESSAGE,@GetMsgProc,hInstance,0);
result:=Shared^.hws;
end;
exports Hookon;

begin
  MemFile:=OpenFileMapping(FILE_MAP_ALL_ACCESS,false,MFileName);
  if MemFile=0 then
  begin
    MemFile:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShared),MFileName);
    Shared:=MapViewOfFile(MemFile,FILE_MAP_WRITE,0,0,0);
  end;
  Shared:=MapViewOfFile(MemFile,FILE_MAP_WRITE,0,0,0);

DllProc:=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
2009-2-18 14:19
0
游客
登录 | 注册 方可回帖
返回