unit Unit_hook;interfaceuses
Windows, Forms, SysUtils,Classes, ExtCtrls, Controls, StdCtrls;const
_KeyPressMask=$80000000;//键盘掩码常量var
hNextHookProc: HHook;
procSaveExit: Pointer;
GameMemAddress:DWord;
GamePath,MyPath:string;
HostWndPro:Hwnd;
CanAttackMon:String;
Hwnd: dword;
function setyzzdhook: bool; export;
function endyzzdhook: bool; export;
procedure HotKeyHookExit; far;
function hookproc(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;
implementationuses Unit_yzzd; //引用的主单元,窗体文件;
function setyzzdhook: bool; export;
begin
result := false; //result 返回值=假
if hnexthookproc <> 0 then
exit;
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD, hookproc, HInstance, 0); //第二个参数是HOOK过程
Result := hNextHookProc <> 0;
end;procedure hotkeyhookexit;
begin
if hNextHookProc <> 0 then
endyzzdHook;
ExitProc := procSaveExit;
end;function endyzzdhook: bool; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
end;
Result := hNextHookProc = 0;
end; xxx.exe是调用这个dll的, 里面就两个函数 (窗体创建时setyzzdhook, 窗体关闭时endyzzdhook) //
我要在 调用这个dll的xxx.exe 发送 endyzzdhook 先执行 Unit_yzzd 单元的一个函数,或者一个按钮.(如:form1.button1.click)
Windows, Forms, SysUtils,Classes, ExtCtrls, Controls, StdCtrls;const
_KeyPressMask=$80000000;//键盘掩码常量var
hNextHookProc: HHook;
procSaveExit: Pointer;
GameMemAddress:DWord;
GamePath,MyPath:string;
HostWndPro:Hwnd;
CanAttackMon:String;
Hwnd: dword;
function setyzzdhook: bool; export;
function endyzzdhook: bool; export;
procedure HotKeyHookExit; far;
function hookproc(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;
implementationuses Unit_yzzd; //引用的主单元,窗体文件;
function setyzzdhook: bool; export;
begin
result := false; //result 返回值=假
if hnexthookproc <> 0 then
exit;
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD, hookproc, HInstance, 0); //第二个参数是HOOK过程
Result := hNextHookProc <> 0;
end;procedure hotkeyhookexit;
begin
if hNextHookProc <> 0 then
endyzzdHook;
ExitProc := procSaveExit;
end;function endyzzdhook: bool; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
end;
Result := hNextHookProc = 0;
end; xxx.exe是调用这个dll的, 里面就两个函数 (窗体创建时setyzzdhook, 窗体关闭时endyzzdhook) //
我要在 调用这个dll的xxx.exe 发送 endyzzdhook 先执行 Unit_yzzd 单元的一个函数,或者一个按钮.(如:form1.button1.click)
没exe的源代码的话可就不是hook而是hack了,而且做的话也是在dll的endyzzdhook处设个陷阱,弄完之后再调用原来的endyzzdhook,何苦还要折腾exe呢
function endyzzdhook: bool; export;
begin
if hNextHookProc <> 0 then
begin
form1.button1.click; //比如我在这里加了 ,xxx.exe关闭的时候发送来endhook就失败,exe不能退出。
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
end;
Result := hNextHookProc = 0;
end;
描述:dll已经注入到了目标程序, 就是退出dll时要执行一次dll里的某个过程或者按钮。
目前的问题是退出调用的exe时被注入的目标程序出错。 可能dll在目标程序里执行的某些操作还没结束,就是想先在dll执行一个释放的函数,再退出dll