Hook的结果有问题,不知道我的代码哪里有问题?(200分)

  • 主题发起人 主题发起人 victorteng
  • 开始时间 开始时间
V

victorteng

Unregistered / Unconfirmed
GUEST, unregistred user!
   
    现想计算电脑的空闲时间(计算机空闲5分钟后开始计时),写一DLL使用HOOK键盘和鼠标消息,但如下代码取得的BeginTime和EndTime值总是不对,请大家看看哪里有问题?(以下只以HOOK键盘消息为例)

unit HKProc;

interface

uses
Windows, Messages,Dialogs,SysUtils,DateUtils;

var
hNextHookProc: HHook;
procSaveExit: Pointer;
//
hNextHookProc1: HHook;
procSaveExit1: Pointer;

f:TextFile;

BeginTime:Tdatetime;
EndTime:Tdatetime;
AddTime:longint;

procedure InsertFreeTime(var FreeTime:integer;var BeginTime:String);
function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
function EnableHotKeyHook: BOOL; export;
function DisableHotKeyHook: BOOL; export;
procedure HotKeyHookExit; far;

function MouseHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
function EnableMouseHook: BOOL; export;
function DisableMouseHook: BOOL; export;
procedure MouseHookExit; far;

implementation

function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
_KeyPressMask = $80000000;

begin
Result := 0;
If iCode < 0 Then
begin
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;
EndTime:=now;
if SecondsBetween(EndTime,BeginTime)>300 then
begin
AssignFile(f, 'C:/abc.txt');
Append(f);
writeln(f,datetimetostr(BeginTime)+' mouse '+datetimetostr(EndTime));
flush(f);
close(f);
end;
BeginTime:=EndTime;
end;
 
因为是 dll,有各自进程的私有堆栈地址。
你可以用内存影像文件来保存这个时间,则写入的数据就会正确了
 
  能否具体说明一下,对你说的内在影像文件不太懂,最好能有代码。

 谢谢!
 
你搜索一下 CreateFileMapping
 
http://www.delphibbs.com/keylife/images/u196832/Global_mouse_keyboard_Hook6_10.rar
这里例子用的是纯API,有文件映射的,一个HOOK键盘的。
 
那我想使用存储过程直接保存到数据库中,如何处理?我现在的代码如下,也是写入的结果有问题。

 function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
_KeyPressMask = $80000000;
begin
Result := 0;
If iCode < 0 Then
begin
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;
EndTime:=now;
AddTime:=SecondsBetween(EndTime,BeginTime);
if AddTime>10 then InsertFreeTime(AddTime,BeginTime,EndTime);
BeginTime:=EndTime;
end;
 
 我不需要记录键盘的值,只是想在截获键盘与鼠标消息时执行一些动作。
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=24809
我收藏的笔记,是c++版的,但是里面调用的api函数一样的,没有多少影响,专门计算空闲的。全英文的,看懂应该没有问题。
 
Cqwty,能否帮忙改写为Delphi的,我试了,但还是有问题,但不知道问题在哪里?
 
   不明白我上面的代码为什么有问题,还得请教一下大家!
 
关键是你怎么定义系统空闲?是没有鼠标键盘操作,还是cpu空闲?既然使用钩子,肯定是没有操作啊,你定义没有鼠标消息?
 
   我这里对系统空闲的定义是指没有鼠标键盘操作,不是CPU空闲,我的代码最主是取得的值:BeginTime,EndTime,AddTime有误,我想应该是DLL共享内存的方式存在问题,还不知道如何解决。
 
问题已解决,真正的问题如白河愁所述!
 

Similar threads

后退
顶部