请教高手象传奇外挂那样的在游戏中按f12弹出外挂窗口(不影响游戏的进行)的技术怎么实现!是不是要用到hook等技术.
请高手赐教,最好附源码!

解决方案 »

  1.   

    你看看用一下这个控件行不行http://www.odao.com/article/disparticle.asp?id=18
      

  2.   

    我说的是在不影响游戏运行的情况下热键弹出窗口的实现的技术啊(不紧紧hook)!是否要用到directx啊!
      

  3.   

    弹出一个Dll文件里面的模式窗口就可以了
      

  4.   

    楼上的说法差不多,外加一些hook技术.
      

  5.   

    问题是DLL文件里面的模式窗口怎么弹出呢?
      

  6.   

    比如我想载游戏中按
    z+alt 自己写的程序中的BUTTION1被按~
    如何实现`
    不要DLL的`
      

  7.   

    dx+hook就ok了,dx得用法去看dx7sdk里面的fswindows的例子,dll里面的要用的dx对象,可以在游戏中找到地址,游戏的屏幕更新过程地址也可以在游戏主程序里面找到地址。
      

  8.   

    这个技术简单,为什么自己不试试?
    很难的,先用VC做一个对话框资源*.res内。
    DirectX不要用全屏(DX8)。
      

  9.   

    呵呵,现在外挂的这个方法,几乎都是抄袭我以前的一个程序的,说穿了很简单的,你去看看创建窗口的那个API,然后动动脑筋就知道了。最近忙,以后有空了,把代码贴给你,其实也就是2行代码,但很久了记忆有点模糊,也懒得找。什么hook呀,什么什么呀,都根本不需要,精简一下的话就一句话搞定:)不过写外挂是很不好的行为,研究是可以的,写是不行的,如果对游戏开发有兴趣,看看这里www.shanda.com.cn:),这个方法其实我们公司的技术都知道
      

  10.   

    你可以去看看以前我花了两个小时写的NCC的客户端部分,没有hook,但是可以把自己的窗口嵌入在传奇里,还可以实现工具条,文本编辑,网络提交,很早以前的一个客户服务软件的简单实现。
      

  11.   

    我也问过这样的问题,但是没有人真的把源程序公开出来。
    现在我自己终于把它写出来了。先写一个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;interfaceuses
      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 部分结束************************
      

  12.   

    调用这个DLL的EXE程序********demo.PAS****************
    unit Unit1;interfaceuses
      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才几天时间,所以写得不是很好,呵
      

  13.   

    调用这个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.//所有代码就这样。
    .........................................................................
      

  14.   

    售:仙境外挂原码(Delphi编写包含控件)包含:服务器端,客户端,更新程序,充值卡程序,后台管理程序,脚本编辑器程序。
    包含开发工具。
    外挂原码共171MB。本程序只能作为学习用途,不得用于商业。联系:QQ7092359
    有限发行10套
      

  15.   

    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(我在测试时试的,忘改回来了)