如题
目前的代码如下,但是没有实现将动作保存到文件中和从文件中读取并回放的步骤。
谢谢各位大侠...
----------------------------------------------------------------------------------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;
Memo1: TMemo;
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.
目前的代码如下,但是没有实现将动作保存到文件中和从文件中读取并回放的步骤。
谢谢各位大侠...
----------------------------------------------------------------------------------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;
Memo1: TMemo;
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.
解决方案 »
- 控件显示层次的问题
- delphi 中如何高效存取SQL Server 2000中BLOB字段?
- 搜索了一个下午了,总结出来的一个问题!
- 请教在DELPHI中如何调用C语言的DLL文件?
- 怎样在DBGrid中一次选中多条记录并一次性删除掉?
- 并于一个CLIENT端与多个SERVER端之间的通信问题?
- 一个关于colordialog的问题
- 用delphi如何写备份数据库得程序?
- 请问,用什么工具可以生成WMF的图片,不够加分
- 如何遍历目录...
- 恐怕会是难倒所有高手的问题,有人解决再开贴500分,Remote Assistan API的调用,返回800704EC错误,组策略冲突错误
- 正则表达式问题。放分不是问题的。。。各位大哥帮帮忙了。。。
iCount: Cardinal;
end; TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Memo1: TMemo;
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;
FRecordHnd: Integer=-1;const RecordFile = 'C:\Record.dat';implementationuses Math;{$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;
var
AHead: THead;
AEvent: EVENTMSG;
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;
FillChar(AHead, SIZEOF(AHead), #0);
FillChar(AEvent, Sizeof(AHead), #0);
AEvent := EventArr[EventLog-1]; FileSeek(FRecordHnd, 0, 0);
FileRead(FRecordHnd, AHead, Sizeof(AHead));
AHead.iCount := AHead.iCount + 1;
FileWrite(FRecordHnd, AHead, Sizeof(AHead));
FileSeek(FRecordHnd, Sizeof(AHead)+100+(EventLog-1)*SizeOf(AEvent), 0);
FileWrite(FRecordHnd, AEvent, Sizeof(AEvent)); if EventLog>=1000 then UnHookWindowsHookEx(hHook);
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
If Not FileExists(RecordFile) then FRecordHnd := FileCreate(RecordFile)
else FRecordHnd := FileOpen(RecordFile, fmOpenReadWrite) ; 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;
FileClose(FRecordHnd);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
I: Integer;
AHead: THead;
AEvent: EVENTMSG;
begin
FillChar(AHead, SIZEOF(AHead), #0); if FRecordHnd < 0 then
FRecordHnd := FileOpen(RecordFile, fmOpenReadWrite); FileSeek(FRecordHnd, 0, 0);
FileRead(FRecordHnd, AHead, SizeOf(AHead)); for I := 0 to AHead.iCount-1 do
begin
FillChar(AEvent, Sizeof(AHead), #0);
FileSeek(FRecordHnd, Sizeof(AHead)+100+I*SizeOf(AEvent), 0);
FileRead(FRecordHnd, AEvent, SizeOf(AEvent));
EventArr[I] := AEvent;
end;
EventLog := AHead.iCount; PlayLog:=0; //建立键盘鼠标操作消息纪录回放链
hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK, PlayProc, HInstance,0);
Button3.Enabled:=False;
end;