要求很简单,在游戏中弹出非模式窗体,
OpenGL,DirectX随便,主要是弹出窗体不影响游戏进行。
求源码!

解决方案 »

  1.   

    那你把这个非模式窗口做成一个单独和APP,然后让它启动就是了
      

  2.   

    设置全局热键 setwindowhookex
    在dll中设置最终在游戏中弹出的对话框,使用dialogbox()函数即可。
      

  3.   

    和金山游侠一样。可以dircectx下智能弹出。
      

  4.   

    请教一下,如何在Delphi中使用DialogBox()顺便,在OpenGL游戏中弹出的非模式窗体,一动就花掉,
    请问应该如何解决?
    谢了!
      

  5.   

    注入后 应该没有这样的问题(花屏),而且在OpenGL中 还需要 考虑把鼠标 激活ShowCursor(False);//OpenGL中的这个 要杀掉呀 要不你没有鼠标 哈哈
    外挂开发??????????????????
      

  6.   

    外挂?哈哈哈……我可没有这能力!
    感兴趣而已!某些游戏中,弹出窗口会花掉……
    你在英雄无敌3里弹个窗口出来看看,
    管你模式还是非模式,一动就……AHLKJ(ABCDE)  期待阁下代码,谢了!
    也感谢参与讨论的各位!
      

  7.   

    library Hook32;uses
      SysUtils,
      Forms,
      Classes,
      MyDll in 'MyDll.pas' {Form1};{$R *.res}exports
      HookOn,HookOff;begin
      {Application.Initialize;
      Application.Run; }
    end.
      

  8.   

    unit myDLl;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
       procedure FormClose(Sender: TObject; var Action: TCloseAction);
      procedure FormDestroy(Sender: TObject);
        procedure FormActivate(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);
            ShowCursor(true);
            try
              {Form1.Caption :='我的DLL中的窗体!';
              LockWindowUpdate(mhwnd);
              SetParent(Form1.Handle,mhwnd);
              MoveWindow(Form1.Handle,1,1,2,2,True);
              UpdateWindow(Form1.Handle);
              UpdateWindow(mhwnd);
              SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE);
              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;
              ShowCursor(true);
              //ResumeThread(hThread);
              kbArray[myKey] := 0;
              SetKeyboardState(kbArray);         finally
              Form1.Free;
             end;
           end
          else
          begin
            Result := CallNextHookEx(hHk,nCode,WParam,LParam);
          end;
       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,hInstance,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.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    bShow:=False;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
    bShow:=False;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    Form1.close;
    end;procedure TForm1.FormActivate(Sender: TObject);
    begin
    ShowCursor(true);
    end;end.
      

  9.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      function HookOn(lpHwnd:HWND;lpType:Longint):Longint;stdcall;external 'HOOK32.DLL' name 'HookOn';
      function HookOff:Boolean;stdcall;external 'HOOK32.DLL' name 'HookOff';
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
    hHandle:HWND;
    hProID:HWND;
    hThrID:HWND;
    h1:HWND;
    begin
    //这些只是自身程序的,没什么用。
    hHandle:=Application.Handle;
    hProID:=GetCurrentProcessId();
    hThrID:=GetCurrentThreadId();
    h1:=FindWindow(NIL,'你的程序');//这是窗口的句柄,要自己找到后,填写入。
    HookOn(h1,WH_KEYBOARD);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    hookoff;
    end;end.
      

  10.   

    非常感谢 AHLKJ(ABCDE) 的代码!
    不过,感觉和在下的题目有点出入。Form1.ShowModal;类似的代码网上不少,方法相同!
    不过在下希望得到一个完善的答复。
    在游戏中弹出非模式窗体,不影响游戏进行。
      

  11.   

    Show 就可以了,把Free拿掉呀....汗...
      

  12.   

    需要的时候在 Free了 就可以了
      

  13.   

    以上程序把ShowModal改为Show确实可以,
    但Show出来以后,一旦失去焦点就会给游戏窗体遮住;
    把Form Show出来以后,游戏一旦最小化就会引起 应用程序错误。不知如何解决,期待阁下高见。