在游戏中弹出非模式窗体,如何实现? 要求很简单,在游戏中弹出非模式窗体,OpenGL,DirectX随便,主要是弹出窗体不影响游戏进行。求源码! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那你把这个非模式窗口做成一个单独和APP,然后让它启动就是了 设置全局热键 setwindowhookex在dll中设置最终在游戏中弹出的对话框,使用dialogbox()函数即可。 和金山游侠一样。可以dircectx下智能弹出。 请教一下,如何在Delphi中使用DialogBox()顺便,在OpenGL游戏中弹出的非模式窗体,一动就花掉,请问应该如何解决?谢了! 注入后 应该没有这样的问题(花屏),而且在OpenGL中 还需要 考虑把鼠标 激活ShowCursor(False);//OpenGL中的这个 要杀掉呀 要不你没有鼠标 哈哈外挂开发?????????????????? 外挂?哈哈哈……我可没有这能力!感兴趣而已!某些游戏中,弹出窗口会花掉……你在英雄无敌3里弹个窗口出来看看,管你模式还是非模式,一动就……AHLKJ(ABCDE) 期待阁下代码,谢了!也感谢参与讨论的各位! library Hook32;uses SysUtils, Forms, Classes, MyDll in 'MyDll.pas' {Form1};{$R *.res}exports HookOn,HookOff;begin {Application.Initialize; Application.Run; }end. 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 :=hHkend;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);beginbShow:=False;end;procedure TForm1.FormDestroy(Sender: TObject);beginbShow:=False;end;procedure TForm1.Button1Click(Sender: TObject);beginForm1.close;end;procedure TForm1.FormActivate(Sender: TObject);beginShowCursor(true);end;end. 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);varhHandle: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);beginhookoff;end;end. 非常感谢 AHLKJ(ABCDE) 的代码!不过,感觉和在下的题目有点出入。Form1.ShowModal;类似的代码网上不少,方法相同!不过在下希望得到一个完善的答复。在游戏中弹出非模式窗体,不影响游戏进行。 Show 就可以了,把Free拿掉呀....汗... 需要的时候在 Free了 就可以了 以上程序把ShowModal改为Show确实可以,但Show出来以后,一旦失去焦点就会给游戏窗体遮住;把Form Show出来以后,游戏一旦最小化就会引起 应用程序错误。不知如何解决,期待阁下高见。 SizeOf 动态 数组 问题 c/s系统如何升级支持Internet访问呢 跪求类似word或记事本或写字本这样的第三方控件 如何取得指定文件夹下指定后缀名(可有多个后缀名)的文件的个数? 如何消除這個時鐘的閃爍? 一个reportbuilder多个子报表的问题??? 制作自己的组件怎样才能换组件的图标? 关于pagecontrol的问题 报表制作的问题?急!!!!! 谁有《Windows网络编程技术》请给我一份 delphi爱好者都来预测一下delphi的未来!!!!! 窗体与分辨率问题,在线等
在dll中设置最终在游戏中弹出的对话框,使用dialogbox()函数即可。
请问应该如何解决?
谢了!
外挂开发??????????????????
感兴趣而已!某些游戏中,弹出窗口会花掉……
你在英雄无敌3里弹个窗口出来看看,
管你模式还是非模式,一动就……AHLKJ(ABCDE) 期待阁下代码,谢了!
也感谢参与讨论的各位!
SysUtils,
Forms,
Classes,
MyDll in 'MyDll.pas' {Form1};{$R *.res}exports
HookOn,HookOff;begin
{Application.Initialize;
Application.Run; }
end.
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.
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.
不过,感觉和在下的题目有点出入。Form1.ShowModal;类似的代码网上不少,方法相同!
不过在下希望得到一个完善的答复。
在游戏中弹出非模式窗体,不影响游戏进行。
但Show出来以后,一旦失去焦点就会给游戏窗体遮住;
把Form Show出来以后,游戏一旦最小化就会引起 应用程序错误。不知如何解决,期待阁下高见。