hook问题:设置全局hook,过程要在DLL中,但不能把全部东西都放在DLL中吧,还有主程序,当钩子函数得到一些信息要传给主程序进一步处理时,要如何做呢,有没有办法做一个回调函数,在主程序中返回信息,或有其它方法和主程通讯,
以前用VB,但不能做全局hook,这两天刚温习了一下delphi,所以不太熟,不知道有没有方法,可以在DLL中返回信息到主程序中。就好象windows回调函数一样
望delphi大侠多多指教,先谢了
以前用VB,但不能做全局hook,这两天刚温习了一下delphi,所以不太熟,不知道有没有方法,可以在DLL中返回信息到主程序中。就好象windows回调函数一样
望delphi大侠多多指教,先谢了
Windows,
Messages,
SysUtils,
Dialogs,
HookType;var
MemFile: THandle;
Shared: PShared;{$R *.res}function ShellProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case iCode of
HSHELL_WINDOWCREATED:
begin
PostMessage(Shared^.MainWnd,WM_USERCMD ,UC_WINCREATE,wParam);
end;
end;
Result := CallNextHookEx(Shared^.ShellHook,iCode,wParam,lParam);
end;function InstallHook:Boolean;
begin
Shared^.Moudle:= hInstance;
Shared^.ShellHook := SetWindowsHookEx(WH_SHELL, @ShellProc, Shared^.Moudle, 0);
if Shared^.KeyHook = 0 then
begin
Result := False;
Exit;
end;
Result := true;
end;function uninstallhook:boolean;stdcall;
begin
result:=unhookwindowshookex(Shared^.ShellHook);
end;procedure DllEntry(dwReason : integer);
begin
case dwReason Of
DLL_PROCESS_ATTACH:
begin
MemFile := OpenFileMapping(FILE_MAP_WRITE,False,HOOK_MEM_FILENAME);
if MemFile = 0 then
MemFile := CreateFileMapping($FFFFFFFF,nil,
PAGE_READWRITE,
0,
SizeOf(TShared),
HOOK_MEM_FILENAME);
Shared := MapViewOfFile(MemFile,
File_MAP_WRITE,
0,
0,
0);
end;
DLL_PROCESS_DETACH:
begin
//
end;
else;
end;
end;exports
InstallHook,
uninstallhook;begin
DllProc := @DllEntry;
DllEntry(DLL_PROCESS_ATTACH);
end.
function UninstallHook: Boolean; stdcall; external 'hook.dll';MemFile := OpenFileMapping(FILE_MAP_WRITE,False,HOOK_MEM_FILENAME);
if MemFile = 0 then
MemFile := CreateFileMapping($FFFFFFFF,nil,
PAGE_READWRITE,
0,
SizeOf(TShared),
HOOK_MEM_FILENAME);
Shared := MapViewOfFile(MemFile,
File_MAP_WRITE,
0,
0,
0);
Shared^.MainWnd := Handle;————————————————————————————————————
这就是你所说的响应部分吧?!
procedure TForm1.WndProc(var Msg: TMessage);
begin
with Msg do
begin
if Msg = WM_usercmd then
begin case wParam of
UC_WINCREATE :
begin
if findwindow(nil,'AutoCAD 2002')<>0 then
showmessage('find autocad')
//证明有应用程序创建了,这里是你的处理(如你可以记录什么时候应用程序启动了)。
end;
end;
end;
end;
inherited;
end;没头没脑 贴段代码 希望有些帮助
Windows, Messages;const
WM_USERCMD = WM_APP + 1;
UC_WINCREATE = WM_APP + 2;
BUFFER_SIZE = 16 * 1024;
HOOK_MEM_FILENAME = 'acad.exe';
type
TShared = record
KeyHook :HHook;
ShellHook:HHook;
CallHook :HHook;
MainWnd :THandle;
Moudle :THandle;
end;
PShared = ^TShared;implementationend.
原因很简单,DLL怎么调用主程序的过程?
只是要达到信息传递的效果,可以使用共享数据区。
要主程序对DLL的信息实时响应,需要设定消息触发主程序动作。