谁能帮我把下面的bcb转换为delphi的,对大虾来说也就几分钟的时间(100分)

  • 主题发起人 主题发起人 小猪的兄弟
  • 开始时间 开始时间

小猪的兄弟

Unregistered / Unconfirmed
GUEST, unregistred user!
输入钩子回调函数:
const int KeyPressMask=0x80000000; //键盘掩码常量
HOOKPROC JournalLogProc(int iCode, WPARAM wParam, LPARAM lParam)
{
if (iCode< 0) return (HOOKPROC)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 (HOOKPROC)CallNextHookEx
(g_hLogHook,iCode,wParam,lParam);
}
 
仔细看看其实有很多重复的

都没人肯帮人家:~~|
 
我贴一篇delphi版的吧。
**************************************************************************
转载:来自csdn的转载


☆★通过Delphi建立键盘鼠标动作纪录与回放★☆



很多的教学软件或系统监视软件可以自动记录回放用户的输入文字或点击按钮等操作操作,这个功能的实现是使用
了Windows的Hook函数。
Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows
消息,函数语法为:
SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD)
其中参数idHook指定建立的监视函数类型。通过Windows MSDN帮助可以看到,SetwindowsHookEx函数提供15种不同
的消息监视类型,在这里我们将使用WH_JOURNALRECORD和WH_JOURNALPLAYBACK来监视键盘和鼠标操作。参数lpfn指定消
息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。函数的一般形式为:
Hookproc (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
其中code为系统指示标记,wParam和lParam为附加参数,根据不同的消息监视类型而不同。只要在程序中建立这样
一个函数再通过SetwindowsHookEx函数将它加入到消息监视链中就可以处理消息了。
在不需要监视系统消息时需要调用提供UnHookWindowsHookEx来解除对消息的监视。
WH_JOURNALRECORD和WH_JOURNALPLAYBACK类型是两种相反的Hook类型,前者获得鼠标、键盘动作消息,后者回放鼠
标键盘消息。所以在程序中我们需要建立两个消息函数,一个用于纪录鼠标键盘操作并保存到一个数组中,另一个用于
将保存的操作返给系统回放。
下面来建立程序,在Delphi中建立一个工程,在Form1上添加3个按钮用于程序操作。另外再添加一个按钮控件和一
个Edit控件用于验证操作。
下面是Form1的全部代码

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

EventArr:array[0..1000]of EVENTMSG;
EventLog:Integer;
PlayLog:Integer;
hHook,hPlay:Integer;
recOK:Integer;
canPlay:Integer;
bDelay:Bool;
implementation

{$R *.DFM}
Function PlayProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
begin
canPlay:=1;
Result:=0;

if iCode < 0 then //必须将消息传递到消息链的下一个接受单元
Result := CallNextHookEx(hPlay,iCode,wParam,lParam)
else if iCode = HC_SYSMODALON then
canPlay:=0
else if iCode = HC_SYSMODALOFF then
canPlay:=1
else if ((canPlay =1 )and(iCode=HC_GETNEXT)) then begin
if bDelay then begin
bDelay:=False;
Result:=50;
end;
pEventMSG(lParam)^:=EventArr[PlayLog];
end
else if ((canPlay = 1)and(iCode = HC_SKIP))then begin
bDelay := True;
PlayLog:=PlayLog+1;
end;
if PlayLog>=EventLog then begin
UNHookWindowsHookEx(hPlay);
end;
end;

function HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
begin
recOK:=1;
Result:=0;

if iCode < 0 then
Result := CallNextHookEx(hHook,iCode,wParam,lParam)
else if iCode = HC_SYSMODALON then
recOK:=0
else if iCode = HC_SYSMODALOFF then
recOK:=1
else if ((recOK>0) and (iCode = HC_ACTION)) then begin
EventArr[EventLog]:=pEventMSG(lParam)^;
EventLog:=EventLog+1;

if EventLog>=1000 then begin
UnHookWindowsHookEx(hHook);
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption:='纪录';
Button2.Caption:='停止';
Button3.Caption:='回放';
Button4.Caption:='范例';
Button2.Enabled:=False;
Button3.Enabled:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EventLog:=0;
//建立键盘鼠标操作消息纪录链
hHook:=SetwindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0);
Button2.Enabled:=True;
Button1.Enabled:=False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnHookWindowsHookEx(hHook);
hHook:=0;

Button1.Enabled:=True;
Button2.Enabled:=False;
Button3.Enabled:=True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
PlayLog:=0;
//建立键盘鼠标操作消息纪录回放链
hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,
HInstance,0);

Button3.Enabled:=False;
end;

end.

代码添加完毕后,运行程序,点击“纪录”按钮开始纪录操作,这时你可以在文本控件中输入一些文字或者点击
“范例”按钮,然后点击“停止”按钮停止纪录,再点击“回放”按钮就可以讲先前所做的操作回放。
在上面的程序中,HookProc是纪录操作的消息函数,每当有鼠标键盘消息发生时,系统都会调用该函数,消息信
息就保存在地址lParam中,我们可以讲消息保存在一个数组中。PlayProc是消息回放函数,当系统可以执行消息回放
时调用该函数,程序就将先前纪录的消息值返回到lParam指向的区域中,系统就会执行该消息,从而实现了消息回放。


**************************************************************************
 
我先将你代码拷下,等一下再试!
但本人能力有限,不一定完全正确,请留言!
 
谢谢doxpix,我试试看
不知道您的程序在功能上是否和下面的这个差不多,
就是日志钩子直接在exe文件里用而不借助dll,实现
键盘记录



wiseant:其实原文是这样的:

WIN95中日志钩子(JournalRecord Hook)的使用
东莞生益敷铜板股份有限公司
肖粤斌
---- 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,
应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些
消息到达目标窗口程序之前处理它们。钩子的种类很多,每种钩子可
以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子
可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,
日志钩子可以监视和记录输入事件。钩子分为线程专用钩子和全局钩子,
线程专用钩子只监视指定的线程,要监视系统中的所有线程,必须用到
全局钩子。对于全局钩子,钩子函数必须包含在独立的动态链接库(DLL)中,
这样才能被各种相关联的应用程序调用。在WINDOWS中,日志钩子是个
很特别的钩子,它只有全局钩子一种,是键盘鼠标等输入设备的消息在系统
消息队列被取出时发生的,而且系统中只能存在一个这样的日志钩子,更重
要是,它不必用在动态链接库中,这样可以省却了为安装一个全局钩子而建
立一个动态链接库的麻烦。利用日志钩子,我们可以监视各种输入事件,下
面的示例可以用来记录键盘的输入,当有按键发生时,自动记录按键动作的
日期和时间以及当前激活的窗口名称。本示例在中文WIN98,
Borland C++ Builder4中编译通过。

---- 1.新建一个工程,在窗体Form1中放置两个按钮Button1和Button2, CAPTION分别为“安装日志钩子”和“卸载日志钩子”。

---- 2. 定义如下全局变量:


HHOOK g_hLogHook=NULL; //钩子变量
HWND g_hLastFocus=NULL;
//记录上一次得到焦点的窗口句柄
const int KeyPressMask=0x80000000; //键盘掩码常量
char g_PrvChar; //保存上一次按键值

3.在Button1的OnClick事件中输入:

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

4.在Button2的OnClick事件中输入:

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

5.输入钩子回调函数:
HOOKPROC JournalLogProc(int iCode,
WPARAM wParam, LPARAM lParam)
{
if (iCode< 0) return (HOOKPROC)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 (HOOKPROC)CallNextHookEx
(g_hLogHook,iCode,wParam,lParam);
}

---- 将工程编译执行后,每当激活一个窗口时,就会把当前窗口名称写入文件
c:/logfile.txt中,当有按键时,按键的名称也会写入此文件中,这里的并没
有处理全部的按键,读者可根据需要添加相应的语句。要捕捉键盘的按键动作,
用键盘钩子(Keyboard Hook)也同样可以实现,但是用日志钩子却比键盘钩子要方
便许多。首先,如果要捕捉其他应用程序的按键,即做成全局钩子,键盘钩子一定
要单独放在动态链接库中,而日志钩子却不必;其次,在键盘钩子函数得到的键盘
按键之前,系统已经处理过这些输入了,如果系统把这些按键屏蔽掉,键盘钩子就
无法检测到它们,例如,当输入屏幕保护程序密码时,键盘钩子无法检测到用户输
入了那些字符,而日志钩子却可以检测到。

---- 无论是哪种钩子, 都会增加系统处理消息的时间,从而降低系统的性能,我们
只有在必要的时候才安装这些钩子,而且尽可能在不需要时移走它们。

 
哈哈!撞枪口上了——我前两个星期刚刚把它改写成Delphi。
不过我并没有完全按它的翻译,比如没有使用时间、没有写入文件,但是也差不多了。

const
KeyPressMask=$80000000; //键盘掩码常量
var
g_hLogHook:HHOOK=0; //钩子变量
g_hLastFocus:HWnd=0; //记录上一次得到焦点的窗口句柄
g_PrvChar:Char; //保存上一次按键值
function JournalLogProc(iCode:Integer;wParam:WPARAM;lParam:LPARAM): LRESULT stdcall;
var
pEvt:^EVENTMSG;
hFocus:HWND; //保存当前活动窗口句柄
szTitle:array[0..255]of Char; //当前窗口名称
vKey:Integer;
ch:Char;
str:array[0..12]of Char;
mstr:String;
iShift:Integer;
iCapital:Integer;
iNumLock:Integer;
bShift:Boolean;
bCapital:Boolean;
bNumLock:Boolean;
begin
Result:=0;
if iCode<0 then
exit;
CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
if iCode=HC_ACTION then
begin
pEvt:=Pointer(DWord(lParam));
if pEvt.message=WM_KEYDOWN then
begin
vKey:=LOBYTE(pEvt.paramL); // 取得虚拟键值
hFocus:=GetActiveWindow(); //取得当前活动窗口句柄
if g_hLastFocus<>hFocus then //当前活动窗口是否改变
begin
GetWindowText(hFocus,szTitle,256);
g_hLastFocus:=hFocus;
mstr:=DateTimeToStr(Now); //得到当前的日期时间
MonitorForm.ListMemo.Lines.Add(mstr+Format(' %s',[szTitle])); //写入文件
end;
iShift:=GetKeyState($10); //测试SHIFT,CAPTION,NUMLOCK等键是否按下
iCapital:=GetKeyState($14);
iNumLock:=GetKeyState($90);
bShift:=(iShift and KeyPressMask)=KeyPressMask;
bCapital:=(iCapital and 1)=1;
bNumLock:=(iNumLock and 1)=1;
MonitorForm.ListMemo.Lines.Add('VKey:'+IntToStr(vKey));
if (vKey>=48) and (vKey<=57) then // 数字0-9
if not bShift then
MonitorForm.ListMemo.Lines.Add(Char(vKey));
if (vKey>=65) and (vKey<=90) then // A-Z a-z
begin
if not bCapital then
begin
if bShift then
ch:=Char(vKey)
else
ch:=Char(vKey+32);
end
else begin
if bShift then
ch:=Char(vKey+32)
else
ch:=Char(vKey);
end;
MonitorForm.ListMemo.Lines.Add(ch);
end;
if (vKey>=96) and (vKey<=105) then // 小键盘0-9
if bNumLock then
MonitorForm.ListMemo.Lines.Add(Char(vKey-96+48));
ch:='n';
if (VKey>105) and (VKey<=111) then
begin
case vKey of
106: ch:='*';
107: ch:='+';
109: ch:='-';
111: ch:='/';
else
ch:='n';
end;
end;
if (vKey>=186) and (vKey<=222) then // 其他键
begin
case vKey of
186: if not bShift then ch:=';' else ch:=':';
187: if not bShift then ch:='=' else ch:='+';
188: if not bShift then ch:=',' else ch:='<';
189: if not bShift then ch:='-' else ch:='_';
190: if not bShift then ch:='.' else ch:='>';
191: if not bShift then ch:='/' else ch:='?';
192: if not bShift then ch:='`' else ch:='~';
219: if not bShift then ch:='[' else ch:='{';
220: if not bShift then ch:='/' else ch:='|';
221: if not bShift then ch:=']' else ch:='}';
222: if not bShift then ch:=Char(27) else ch:='"';
else
ch:='n';
end;
end;
if ch<>'n' then
MonitorForm.ListMemo.Lines.Add(ch);
// if (wParam >=112 && wParam<=123) // 功能键 [F1]-[F12]
if (vKey>=8) and (vKey<=46) then //方向键
begin
ch:=' ';
case vKey of
8: str:='[BackSpace]';
9: str:='[TAB]';
13: str:='[Enter]';
32: str:='[Space]';
33: str:='[PageUp]';
34: str:='[PageDown]';
35: str:='[End]';
36: str:='[Home]';
37: str:='[LF]';
38: str:='[UF]';
39: str:='[RF]';
40: str:='[DF]';
45: str:='[Insert]';
46: str:='[Delete]';
else
ch:='n';
end;
if ch<>'n' then
begin
if g_PrvChar<>Char(vKey) then
begin
MonitorForm.ListMemo.Lines.Add(str);
g_PrvChar:=Char(vKey);
end;
end;
end;
end
else if (pEvt.message=WM_LBUTTONDOWN) or (pEvt.message=WM_RBUTTONDOWN) then
begin
hFocus:=GetActiveWindow;
if g_hLastFocus<>hFocus then
begin
g_hLastFocus:=hFocus;
GetWindowText(hFocus,szTitle,256);
mstr:=DateTimeToStr(Now); //得到当前的日期时间
MonitorForm.ListMemo.Lines.Add(mstr+Format(' %s',[szTitle]));
end;
if pEvt.message=WM_LBUTTONDOWN then
mstr:='LButtonDown at: '
else
mstr:='RButtonDown at: ';
MonitorForm.ListMemo.Lines.Add(mstr+Format('x:%d,y:%d',[pEvt.paramL,pEvt.paramH]));
end;
end;
Result:=CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
end;
 
啊,撞枪口了

您好像成为我的专职解答员了^_^

看看先
 
我说,这两个事件好像没错啊
procedure TForm1.Button1Click(Sender: TObject);
begin
if (g_hLogHook=null) then
g_hLogHook:=SetWindowsHookEx(WH_JOURNALRECORD,
JournalLogProc,HInstance,0);
end;

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

我把null都改成0就对了,但这是为什么呢,c++builder原程里都是null啊

错误类型是“不合法的可变类型转换”

 
System.pas
Null: Variant; { Null standard constant }
Null在Delphi中被声明为可变类型。

Windows.pas
HHOOK = type LongWord;
{$EXTERNALSYM HHOOK}
HHook是长字类型。

由于历史的原因,null在C中一直就代表0,所以可以赋给LongWord类型的变量,而在Delphi中,
这两者完全不同,所以在赋值的过程中发生错误也是可以解释的。至于“g_hLogHook<>null”
为什么可以通过,我还不太明白,估计是编译器经它们都做了适当的转换。

我认为在C++中使用“g_hLogHook=NULL;”也是不规范的,因为null一直就用于赋给指针以空值,
而此处的HHOOK是句柄,不是指针,所以应该使用“g_hLogHook=0;”。
 
好了,不用小弟献丑了。
 
太谢谢大家了
我本来以为这么长的东西帖出来
能给予我帮助的人一定很少
大家都有自己的事要做
但几位朋友能这样帮助我
真是谢谢你们了

doxpix的文章使我对hook的基本函数有了一个基础了解
creation-zy给予了小猪猪零距离的帮助
wiseant虽然没能帮上忙,但一定也在下面试图帮我译过程序

隐藏人物:小猪。可能也正准备帮兄弟,不过来迟了一步:)
可惜你没留下什么话,我想给你分也找不到你

好吧,该结束了
 
呵呵 这好热闹 啊
 
谢谢了,这个对我有很大的帮助的!
 
后退
顶部