先写一个DLL,把这DLL注入到游戏的进程中。   
  *********************DLL   的Hook32.dpr文件****************   
  library   Hook32;   
    
  uses   
      Forms,   
      myDLl   in   'myDLl.pas'   {Form1};   
    
  {$R   *.res}   
  exports   
      HookOn,HookOff;   
    
  begin   
      {Application.Initialize;   
      Application.Run;   }   
  end.   
  *************DLL   的PAS文件***************   
  unit   myDLl;   
    
  interface   
    
  uses   
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,   
      Dialogs,   StdCtrls;   
    
  type   
      TForm1   =   class(TForm)   
          Button1:   TButton;   
          Memo1:   TMemo;   
          Edit1:   TEdit;   
          procedure   Button1Click(Sender:   TObject);   
          procedure   FormClose(Sender:   TObject;   var   Action:   TCloseAction);   
          procedure   FormDestroy(Sender:   TObject);   
      private   
          {   Private   declarations   }   
      public   
          {   Public   declarations   }   
      end;   
    
  var   
      Form1:   TForm1;   
      function   HookProc(nCode:Integer;WParam:   WPARAM;LParam:LPARAM):LRESULT;stdcall;   
      function   HookOn(lpHwnd:HWND;lpType:Longint):Longint;stdcall;export;   
      function   HookOff:Boolean;stdcall;export;   
    
  implementation   
    {type     KeyboardBytes=record   
          kbArray:array[0..255]   of   byte;   
    end;}   
    
    var   
        hHk:   HHOOK=0;   
        hMOUSEHk:   HHOOK=0;   
        mhwnd:HWND=0;   
        bShow:Boolean=False;   
        myKey:Byte=VK_F7;   
        kbArray:TKeyboardState;   
        hThread:   Cardinal;   
        hmod:   Pointer;   //Hinstance   
        hProcessId:   Cardinal;   
    
      {   KeyHookStruct:^THardwareHookStruct;   
        mMode:Integer;   }   
    
  {$R   *.dfm}   
    
  function   HookProc(nCode:Integer;WParam:   WPARAM;LParam:LPARAM):LRESULT;stdcall;   
    
  begin   
      Result   :=0;   
      if   nCode<0   then   
            Result   :=   CallNextHookEx(hHk,nCode,WParam,LParam)   
      else   
        begin   
            GetKeyboardState(kbArray);   
            if   (bShow=False)   And   (kbArray[myKey]=1)   then   
            begin   
                  bShow:=True;   
                  Form1:=TForm1.Create(Application);   
                  try   
                      Form1.Caption   :='我的DLL中的窗体!';   
                      //LockWindowUpdate(mhwnd);   
                      //SetParent(Form1.Handle,mhwnd);   
                                          //MoveWindow(Form1.Handle,1,1,300,200,True);   
                      //UpdateWindow(Form1.Handle);   
                      //UpdateWindow(mhwnd);   
                      SetWindowPos(Form1.Handle,   HWND_TOPMOST,   0,   0,   0,   0,   SWP_NOMOVE   Or   SWP_NOSIZE);   
                      Sleep(200);   
                      //CopyMemory(KeyHookStruct,Pointer(LParam),sizeof(KeyHookStruct));   
                      //Form1.Edit1.Text   :=string(KeyHookStruct.message);   
                      //Form1.Memo1.Lines.Append(Str(KeyHookStruct.hwnd));   
                      //UpdateWindow(mhwnd);   
                      //mMode:=GetMapMode(GetDC(mhwnd));   
                      //SetMapMode(GetDC(Form1.Handle),mMode);   
                      //UpdateWindow(Form1.Handle);   
                      //SetWindowLong(Form1.Handle,GWL_STYLE,GetWindowLong(mhwnd,   GWL_STYLE));   
                      Result   :=1;   
                      SuspendThread(hThread);   
                      Form1.ShowModal;   
                      ResumeThread(hThread);   
                      kbArray[myKey]   :=   0;   
                      SetKeyboardState(kbArray);   
                    finally   
                      Form1.Free;   
                    end;   
                end   
              else   
                  Result   :=   CallNextHookEx(hHk,nCode,WParam,LParam)   
        end;   
  end;   
    
  function   HookOn(lpHwnd:HWND;lpType:Longint):   Longint;stdcall;   export;   
  begin   
      mhwnd:=lpHwnd;   
      if   hHk<>0   then   UnHookWindowsHookEx(hHk);   
      hThread   :=GetWindowThreadProcessId(mhwnd,hmod);   
      hProcessId:=cardinal(hmod);   
      Sleep(200);   
      hHk   :=SetWindowsHookEx(lpType,@HookProc,hProcessId,hThread);   //   WH_KEYBOARD   
      Result   :=hHk   
  end;   
    
  function   HookOff:Boolean;stdcall;   export;   
  begin   
        if   hHk<>0   then   
            begin   
                UnHookWindowsHookEx(hHk);   
                hHk   :=0;   
                Result   :=true;   
            end   
        else   
              Result   :=false;   
  end;   
  procedure   TForm1.Button1Click(Sender:   TObject);   
  begin   
  Form1.close;   
  end;   
    
  procedure   TForm1.FormClose(Sender:   TObject;   var   Action:   TCloseAction);   
  begin   
  bShow:=False;   
  end;   
    
  procedure   TForm1.FormDestroy(Sender:   TObject);   
  begin   
  bShow:=False;   
  end;   
    
  end.   
  *************DLL   部分结束************************   
    
    
    
调用这个DLL的EXE程序   
    
  ********demo.PAS****************   
  unit   Unit1;   
    
  interface   
    
  uses   
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,   
      Dialogs,   StdCtrls;   
    
  type   
      TForm1   =   class(TForm)   
          Edit1:   TEdit;   
          Label1:   TLabel;   
          Edit2:   TEdit;   
          Label2:   TLabel;   
          Edit3:   TEdit;   
          Label3:   TLabel;   
          Memo1:   TMemo;   
          CheckBox1:   TCheckBox;   
          procedure   FormCreate(Sender:   TObject);   
          procedure   CheckBox1Click(Sender:   TObject);   
      private   
          {   Private   declarations   }   
      public   
          {   Public   declarations   }   
      end;   
    
  var   
      Form1:   TForm1;   
      function   HookOn(lpHwnd:HWND;lpType:Longint):Longint;stdcall;external   'D:\Delphi编程\DLL\HOOK32.DLL'   name   'HookOn';   
      function   HookOff:Boolean;stdcall;external   'D:\Delphi编程\DLL\HOOK32.DLL'   name   'HookOff';   //DLL的路径要改成你所用的路径,这是我机器中的。   
    
  implementation   
    
  {$R   *.dfm}   
    
  procedure   TForm1.FormCreate(Sender:   TObject);   
  var   
  hHandle:HWND;   
  hProID:HWND;   
  hThrID:HWND;   
  begin   
  //这些只是自身程序的,没什么用。   
  hHandle:=Application.Handle;   
  hProID:=GetCurrentProcessId();   
  hThrID:=GetCurrentThreadId();   
  edit1.Text   :=IntToStr(hHandle)+   '       '+   string(IntToHex(hHandle,1));   
  edit2.Text   :=IntToStr(hProID)+   '       '+   string(IntToHex(hProID,1));   
  edit3.Text   :=IntToStr(hThrID)+   '       '+   string(IntToHex(hThrID,1));   
    
  //edit1.Text   :=   Application.ExeName;   
  end;   
    
  procedure   TForm1.CheckBox1Click(Sender:   TObject);   
  var   
  h1:HWND;   
    
  begin   
  if   checkbox1.Checked   =   true   then   
  begin   
  h1:=HWND(edit1.Text);//这是游戏窗口的句柄,要自己找到后,填写入Edit文本框中。   
  HookOn(h1,WH_KEYBOARD);   
  end   
  else   
  HookOff();   
  end;   
    
  end.   
    
  //这样就OK了,只是界面变色了。还要处理一下。   
  //我以前是用VB的,学Delphi才几天时间,所以写得不是很好,呵
调用这个DLL的EXE程序   
    
  ********demo.dpr****************   
  program   demo;   
    
  uses   
      Forms,   
      Unit1   in   'Unit1.pas'   {Form1};   
    
      {$R   *.res}   
    
  begin   
      Application.Initialize;   
      Application.CreateForm(TForm1,   Form1);   
      Application.Run;   
  end.   
    
  //所有代码就这样。   
  .........................................................................谁能帮我把这些源码放进delphi7里? 然后保存成工程发给我?
e-mail:[email protected]小弟刚学delphi7 ,对pas 还有dpr什么什么的。不是很清楚.

解决方案 »

  1.   

    function   HookOn(lpHwnd:HWND;lpType:Longint):   Longint;stdcall;   export;   
      begin   
          mhwnd:=lpHwnd;   
          if   hHk<>0   then   UnHookWindowsHookEx(hHk);   
          hThread   :=GetWindowThreadProcessId(mhwnd,hmod);   
          //hProcessId:=cardinal(hmod);   
          //Sleep(200);   
          hHk   :=SetWindowsHookEx(lpType,@HookProc,hInstance,hThread);   //   WH_KEYBOARD   
          Result   :=hHk   
      end;   
        
      //hProcessId,改成hInstance(我在测试时试的,忘改回来了)
      

  2.   

    function   HookOn(lpHwnd:HWND;lpType:Longint):   Longint;stdcall;   export;   
      begin   
          mhwnd:=lpHwnd;   
          if   hHk<>0   then   UnHookWindowsHookEx(hHk);   
          hThread   :=GetWindowThreadProcessId(mhwnd,hmod);   
          //hProcessId:=cardinal(hmod);   
          //Sleep(200);   
          hHk   :=SetWindowsHookEx(lpType,@HookProc,hInstance,hThread);   //   WH_KEYBOARD   
          Result   :=hHk   
      end;   
        
      //hProcessId,改成hInstance(我在测试时试的,忘改回来了)
      

  3.   

    你直接拷代码进去,报错就解决,然后编译,成了dll
    另外exe另起一个工程,放代码进去,编译通过,dll位置得放对。
    如果是动态调用更要注意了。
    dpr为工程文件,pas为单元文件,dcu编译文件
      

  4.   

    DLL还要分dpr和pas 而我名字定义说什么模块或者什么有了不能
      

  5.   

    h1:=HWND(edit1.Text);//这种写法似乎不好吧?