我模仿外挂写了段代码,在奇迹(MU)中可以弹出一个窗口,但是有些问题。第一,如果窗口的ParentHandle设成奇迹(MU)的窗口,那么弹出的窗口没有鼠标箭头,你连续双击弹出窗口的输入框,那么奇迹的密码输入框将不能在输入任何字符(就好像在不能获得焦点一样,但是光标的位置还在密码框上。)第二,奇迹(MU)可能设计了自己的保护方法,也就是在失去激活状态后会马上退出程序(你可以按两下WIN键试试效果)。同样道理,这样用SetParent的方法把他的全屏模式改成了窗口模式,你去点两下窗口外或窗口的Title,那么奇迹(MU)也会马上退出。针对上面我想问三个问题,一,怎么在奇迹(MU)中做一个有鼠标可操作的弹出式对话框。二,怎样在让奇迹在焦点移到对话框后,重新获得输入焦点,并能够输入。三,怎样解决奇迹(MU)失去激活状态后不退出程序。

解决方案 »

  1.   

    我自己瞎猜啊。
    是不是可以这样,让奇迹(MU)和你的对话框共存。。
    估计奇迹的winmain里面总有类似的代码
     while (TRUE) {
            if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                    // Translate and dispatch the message
                 TranslateMessage(&msg);
                 DispatchMessage(&msg);
              }
            else
               UpdateGameFrame(); //这个一般就是游戏图象刷新入口
        }
    能不能dll判断如果按键hotkey,把上面的代码改一下。
    比如:
            else
               UpdateGameFrame(); //这个一般就是游戏图象刷新入口  //把这个地方改成
    UpdateGameFrame();后,再显示你的modeless dialog窗口,这样不就能共存了吗??
    估计弹出的是model dialog,游戏程序就会有问题
      

  2.   

    楼主你是不是想搞MU的外挂啊,我也是练MU的,呵呵,希望你能搞出来啊。delphi这方面的东东我不是很会啦,帮不上了,纯帮你顶一下而已
      

  3.   

    希望大家都来赐教。MuWHandle := FindWindow(nil,'MU');
    PopForm.ParentHandle := MuWHandle; ---没有鼠标,没有焦点,但是窗口可以弹出来
    //windows.SetParent(PopForm.Handle,MuWHandle);  ---会有闪烁现象,不知道怎么解决
    PopForm.Show;
    PopForm.Repaint;上面是我写的代码的部分,当然是用HOOK来呼出的。
    大家可以试试,然后再来告诉我解决方法。
      

  4.   

    不会闪的话,有方法解决,可是获取焦点还是没有办法...
    重载窗体的下面函数.
    procedure TDialogForm.Createparams(var Params: TCreateParams);
    begin  inherited;
      With Params do
      begin
         Style := WS_CHILD;
         EXStyle:=WS_EX_TOPMOST;   
         WndParent := GetDesktopWindow; 
      end;
    end;
      

  5.   

    其实楼主可以试着和外挂制作者探讨一下,说不定可以加入hoho^_^
      

  6.   

    我分析了mu的反汇编代码,他创建主窗口是用的CreateWindowsEX()函数,其中dwStyle:WS_POPUP, dwExStyle:WS_EX_TOPMOST | WS_EX_APPWINDOW。
    并且我发现很重要的一点就是在winmain()的主事件循环前注册了一个热键:RegisterHotKey
    你们猜是什么?哈哈,就是Alt+Tab。
    .text:004150F4 6A 09             push    9                     ; vk:VK_TAB
    .text:004150F6 6A 01             push    1                     ; Modifiers:MOD_ALT
    .text:004150F8 6A 00             push    0                     ; id
    .text:004150FA A1 14 1E 61 05    mov     eax, hWnd
    .text:004150FF 50                push    eax                   ; hWnd
    .text:00415100 FF 15 C8 C2 5A 00 call    ds:RegisterHotKey
      

  7.   

    >第一,如果窗口的ParentHandle设成奇迹(MU)的窗口,那么弹出的窗口没有鼠标箭头,你连续双击>弹出窗口的输入框,那么奇迹的密码输入框将不能在输入任何字符(就好像在不能获得焦点一样,
    >但是光标的位置还在密码框上。)以上所说没有鼠标可能是因为游戏的画面全是由DirectX游戏引擎控制了最低层的显卡硬件来绘制的,游戏中的鼠标是由游戏引擎的绘图接口绘制的精灵.窗体自定的鼠标已被程序设为隐形了.在编写游戏时就不能调用普通的GDI来绘窗体和控件.所以一般程序中的以GDI为低层的窗体和控件在做为游戏主窗体的子窗体时就会出现异常.估计用DirectX中的图形接口在游戏窗体上自绘窗体和控件不会有问题.这样的程序没有试过.学习一下DirectX游戏编程对做这们的外挂应该会有帮助.
      

  8.   

    mu用的是OpenGL,并不是DirectX,只是声音部分用的才是DirectSound,大家要注意的是在Windows系统下的OpenGL是不允许用GDI函数的,向常用的DrawText等,所以关于DirectX的讨论就不必了,回去看看Windows下OpenGL编程方面的资料吧!!!
      

  9.   

    分全给我
    我给原代码~~
    主要是使用钩子进行进程注入
    先SetWindowsHookEx安装目标窗口的钩子,一般是用WH_GETMESSAGE钩住GetMessage函数,这样可以抢先获取消息。
    再向目标窗口发送任意消息(一般是无意义消息),就可以触发已经注入目标窗口进程的自己的程序,用SetWindowLong改变其窗口响应函数,就可以响应自己定制的消息,可以完成弹出窗口等自己想要的功能了。
    弹出窗口时只要设置弹出窗口的父窗口为目标窗口,因为又在目标窗口的进程空间中,就可以实现DX下弹出了。
      

  10.   

    DWDLL(不跟利索) 你好,我分析了几个外挂,的确如你所说。
      

  11.   

    奇迹(MU)?你提到的问题 我也都 遇到了.0.95版 又多了个 反挂 程序........
    第一:
    不是 获取焦点的问题.......
    OpenGL 程序中ShowCursor(True)第二:
    你用HOOK注入MU 就没问题了!我也正在研究MU的外挂程序 正在努力中............
      

  12.   

    to D_Q(A.Dai)(阿呆) 
    我耶用第2点啊,呵呵