请教高手象传奇外挂那样的在游戏中按f12弹出外挂窗口(不影响游戏的进行)的技术怎么实现!是不是要用到hook等技术.
请高手赐教,最好附源码!
请高手赐教,最好附源码!
解决方案 »
- delphi调用vc编写dll出错的请教
- adodataset用filter过滤后,dbgrid里还能显示表里所有的数据吗?
- 能改变delphi的dbgrid第一行的高度和字段名分两行显示吗?
- ★★★★csdn的改革迫在眉睫,支持中国软件与csdn发展的朋友请进,要分的朋友别进,这里不分等级不分贫贱
- 用户分权限登陆问题
- Packed Record长度的问题
- 可用分和信誉分如何增加的啊?
- 我想建立一个可自由定制的TreeView形的分类表,每个Node都和数据库中的某些记录相关联,请给些建议
- 消息框的问题
- <<<<没有好的笑话了,list如何快速清空?delete太慢。
- 有关SQL语句select问题
- 如何在installshield pro6.22中打包BDE
z+alt 自己写的程序中的BUTTION1被按~
如何实现`
不要DLL的`
很难的,先用VC做一个对话框资源*.res内。
DirectX不要用全屏(DX8)。
现在我自己终于把它写出来了。先写一个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 部分结束************************
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才几天时间,所以写得不是很好,呵
program demo;uses
Forms,
Unit1 in 'Unit1.pas' {Form1}; {$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.//所有代码就这样。
.........................................................................
包含开发工具。
外挂原码共171MB。本程序只能作为学习用途,不得用于商业。联系:QQ7092359
有限发行10套
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(我在测试时试的,忘改回来了)