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)

解决方案 »

  1.   

    既然有dll的源代码,干嘛不在dll里直接改endyzzdhook调用一下不就完了么?
    没exe的源代码的话可就不是hook而是hack了,而且做的话也是在dll的endyzzdhook处设个陷阱,弄完之后再调用原来的endyzzdhook,何苦还要折腾exe呢
      

  2.   

    我没说改exe, 就是要在dll里执行。 目前我用exe 发送endhook 不能执行 form1.button1.click
    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;
      

  3.   

    导致不能退出的原因是发生循环调用了?那在exe里调用和在dll里调用的效果都一样,还是不能退出,不如再导出一个调用的过程让exe根据情况调用
      

  4.   

    你调用form1.button1.click的时候,form1是不是已经释放了
      

  5.   

     那个dll窗体是hook注入 挂到另一个程序上的. 没有释放的,
      

  6.   


    描述:dll已经注入到了目标程序, 就是退出dll时要执行一次dll里的某个过程或者按钮。 
    目前的问题是退出调用的exe时被注入的目标程序出错。    可能dll在目标程序里执行的某些操作还没结束,就是想先在dll执行一个释放的函数,再退出dll
      

  7.   

    既然是注入,那不如再拦截个主窗体的WM_CLOSE之类的消息,在主窗体收到退出的消息前进行清理