先写一个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;
interface
uses
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 部分结束************************
调用这个DLL的EXE程序
********demo.PAS****************
unit Unit1;
interface
uses
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才几天时间,所以写得不是很好,呵
调用这个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.
//所有代码就这样。
.........................................................................谁能帮我把这些源码放进delphi7里? 然后保存成工程发给我?
e-mail:[email protected]小弟刚学delphi7 ,对pas 还有dpr什么什么的。不是很清楚.
*********************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;
interface
uses
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 部分结束************************
调用这个DLL的EXE程序
********demo.PAS****************
unit Unit1;
interface
uses
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才几天时间,所以写得不是很好,呵
调用这个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.
//所有代码就这样。
.........................................................................谁能帮我把这些源码放进delphi7里? 然后保存成工程发给我?
e-mail:[email protected]小弟刚学delphi7 ,对pas 还有dpr什么什么的。不是很清楚.
解决方案 »
- delphi中关于treeview的使用
- 做控件时,发现事件处理的问题...
- 如何让组件在onchang时自动执行一段代码?
- 问一个编程的简单问题。
- 如何用WINEXEC调用一个CHM文件?
- 本人经过半年多的努力开发的中式报表系统(AnyCell Report),欢迎下载!并请大家多多关注!
- 关于DLL中动态创建ADO的问题
- 我是sql-server的初学者,有些初级的问题想请教:
- 摩托车经销处,每天卖50多辆。。这样一个单位的进销存该怎么写?
- 除了adoquery.savetofile之外,还有什么方法可以把查询的记录保存,并且能够将来再添加数据资料呢??
- DBGird中的列输入在输入过程中与其它列参与计算
- Service中弹出消息提示
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(我在测试时试的,忘改回来了)
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(我在测试时试的,忘改回来了)
另外exe另起一个工程,放代码进去,编译通过,dll位置得放对。
如果是动态调用更要注意了。
dpr为工程文件,pas为单元文件,dcu编译文件