同题 谢谢
最好简单说说具体函数怎么用的 稍微复杂点的msdn目前我实在看不懂

解决方案 »

  1.   

    最简单的就是用SetTimer,记录下鼠标的位置,保存在文本文件中,
    得到位置用GetCursorPos,
    回放时反操作,用SetCursorPos 来指定鼠标到指定的位置
      

  2.   

    对了 你开始时提到的
    GetCursorPos与SetCursorPos
    只能录放鼠标的位置 不能录放鼠标键的状态啊
      

  3.   

    如果说用到Directx来得到鼠标状态,可能又太深了,
    所以可以想出不用DirectX,而使用现在有的函数来组合实现.
    int x,y,lm,mm,rm;//分别为位置X,位置Y,左键状态,中键状态,右键状态
    在定时器时不停的保存此5个值在PreTranslateMessage中:
    if(pMsg->message==WM_LBUTTONDOWN)
     lm=1;
    if(pMsg->message==WM_LBUTTONUP)
     lm=0;依次类推,改为鼠标其它两个键的状态.回放时,用key_event来模拟操作
      

  4.   

    msdn没找见key_event,用mouse_event实现了鼠标的回放one more question,键盘的呢。。怎么处理?
    1.message==??(键盘有关的)
    2.key_event没有 用什么来模拟键盘呢??好人一生平安
      

  5.   

    感谢回复ms是啥我都听不懂。。钩子is what啊。。我只是做一个基于对话框的mfc的作业鼠标的录放经2楼指点已经实现 不过键盘。迷茫中。。(顺便问下codewarrior,freescale的样片怎么申请?谢)
      

  6.   

    又down了 这是我的第一个问题啊 请大家多多关照
      

  7.   

    没申请过,我们lab和freescale向来都是直接要板子片子的嚯嚯……
      

  8.   

    没做过,个人觉得zhucde的方案可行。
    我的思路是用鼠标钩子记录下来鼠标事件,然后加以回放即可。
    控制鼠标倒是在lpc2106上做过,跑的是uCOS,按串口鼠标的协议往串口上发数据即可。
      

  9.   

    高人说的太高深了 我学生一个 没什么开发经验 听的雾茫茫一片
    不过还是仍然感谢 当时不知道新请的号就有分 否则一定给二位分回到主题:谁能告我如何录放键盘动作的具体函数 谢谢 最好是可以用在基于对话框的mfc中的p.s.我感觉二位的方案都可行,不过小弟初初学 在浩瀚的msdn中 实在是找不到我要用的函数
      

  10.   

    其实用WH_JOURNALRECORD类型的钩子就完全可以符合你的要求。
      

  11.   

    7、WH_JOURNALRECORD Hook 
    WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的,可以使用这个Hook记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACK Hook来回放。WH_JOURNALRECORD Hook是全局Hook,它不能象线程特定Hook一样使用。WH_JOURNALRECORD是system-wide local hooks,它們不會被注射到任何行程位址空間。
      

  12.   

    编写钩子程序的步骤分为三步:定义钩子函数、安装钩子和卸载钩子。 
      1.定义钩子函数 
      钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是各不相同的。下面以鼠标钩子函数举例说明钩子函数的原型: 
    LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam) 
    参数wParam和 lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。nCode包含有关消息本身的信息,比如是否从消息队列中移出。 
    我们先在钩子函数中实现自定义的功能,然后调用函数 CallNextHookEx.把钩子信息传递给钩子链的下一个钩子函数。CallNextHookEx.的原型如下: 
    LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam  
    参数 hhk是钩子句柄。nCode、wParam和lParam 是钩子函数。 
    当然也可以通过直接返回TRUE来丢弃该消息,就阻止了该消息的传递。 
    2.安装钩子 
      在程序初始化的时候,调用函数SetWindowsHookEx安装钩子。其函数原型为: 
    HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId  
    参数idHook表示钩子类型,它是和钩子函数类型一一对应的。比如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示是鼠标钩子等等。 
      Lpfn是钩子函数的地址。 
      HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。 
       dwThreadId 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。 
      SetWindowsHookEx返回所安装的钩子句柄。 
      3.卸载钩子 
       当不再使用钩子时,必须及时卸载。简单地调用函数 BOOL UnhookWindowsHookEx( HHOOK hhk)即可。 
       
      

  13.   

    Thanks a lot.
    不过鄙人不行了 面对了两整天vs2005 要疯了都
    非常感谢
    我明天再试试 要不然今天就死了
      

  14.   

    善用搜索引擎,善用codeproject和codeguru这样的站点。
      

  15.   

    上面的讲的勾子技术已经可以了,下面有段delphi写的原代码,在delphi中可以完全通过,VC和它的原理和操作基本相同,发给你参考一下。
    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指向的区域中,系统就会执行该消息,从而实现了消息回放。