2009年8月12日

  vk_LButton     =   $01;  
  vk_RButton     =   $02;  
  vk_Cancel         =   $03;  
  vk_MButton     =   $04;     {   NOT   contiguous   with   L   &   RBUTTON   }  
  vk_Back             =   $08;  
  vk_Tab             =   $09;  
  vk_Clear         =   $0C;  
  vk_Return         =   $0D;  
  vk_Shift         =   $10;  
  vk_Control     =   $11;  
  vk_Menu             =   $12;  
  vk_Pause         =   $13;  
  vk_Capital     =   $14;  
  vk_Escape         =   $1B;  
  vk_Space         =   $20;  
  vk_Prior         =   $21;  
  vk_Next             =   $22;  
  vk_End             =   $23;  
  vk_Home             =   $24;  
  vk_Left             =   $25;  
  vk_Up                 =   $26;  
  vk_Right         =   $27;  
  vk_Down             =   $28;  
  vk_Select         =   $29;  
  vk_Print         =   $2A;  
  vk_Execute     =   $2B;  
  vk_SnapShot     =   $2C;  
  vk_Copy             =   $2C   not   used   by   keyboards   }  
  vk_Insert         =   $2D;  
  vk_Delete         =   $2E;  
  vk_Help             =   $2F;  
  vk_A   thru   vk_Z   are   the   same   as   their   ASCII   equivalents:   'A'   thru   'Z'   }  
  vk_0   thru   vk_9   are   the   same   as   their   ASCII   equivalents:   '0'   thru   '9'   }  
  vk_NumPad0     =   $60;  
  vk_NumPad1     =   $61;  
  vk_NumPad2     =   $62;  
  vk_NumPad3     =   $63;  
  vk_NumPad4     =   $64;  
  vk_NumPad5     =   $65;  
  vk_NumPad6     =   $66;  
  vk_NumPad7     =   $67;  
  vk_NumPad8     =   $68;  
  vk_NumPad9     =   $69;  
  vk_Multiply     =   $6A;  
  vk_Add             =   $6B;  
  vk_Separator   =   $6C;  
  vk_Subtract     =   $6D;  
  vk_Decimal     =   $6E;  
  vk_Divide         =   $6F;  
  vk_F1                 =   $70;  
  vk_F2                 =   $71;  
  vk_F3                 =   $72;  
  vk_F4                 =   $73;  
  vk_F5                 =   $74;  
  vk_F6                 =   $75;  
  vk_F7                 =   $76;  
  vk_F8                 =   $77;  
  vk_F9                 =   $78;  
  vk_F10             =   $79;  
  vk_F11             =   $7A;  
  vk_F12             =   $7B;  
  vk_F13             =   $7C;  
  vk_F14             =   $7D;  
  vk_F15             =   $7E;  
  vk_F16             =   $7F;  
  vk_F17             =   $80;  
  vk_F18             =   $81;  
  vk_F19             =   $82;  
  vk_F20             =   $83;  
  vk_F21             =   $84;  
  vk_F22             =   $85;  
  vk_F23             =   $86;  
  vk_F24             =   $87;  
  vk_NumLock     =   $90;  
  vk_Scroll         =   $91;

posted @ 2009-08-12 10:34 唐工 阅读(179) 评论(0) 编辑


2009年8月11日

 很多的教学软件或系统监视软件可以自动记录回放用户的输入文字或点击按钮等操作操作,这个功能的实现是使用  
  了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指向的区域中,系统就会执行该消息,从而实现了消息回放。  

posted @ 2009-08-11 17:09 唐工 阅读(2321) 评论(5) 编辑


2009年7月15日

    该文被密码保护。

posted @ 2009-07-15 13:15 唐工 阅读(6) 评论(0) 编辑

有一只骆驼从A地运送3000只香蕉到B地,两地相距1000里,每次最多能载1000只蕉,但是骆驼每行一里路就要吃一只香蕉,没有香蕉吃它是不肯走的,问到达B地点后最多能剩几只 香蕉?

posted @ 2009-07-15 13:14 唐工 阅读(84) 评论(1) 编辑


2009年7月8日

据说delphi5到delphi7一直有这个bug,不知道更高的版本有没有改过来

我用的是delphi7

 

对Delphi了解得并不多,这次写ocx也是赶鸭子上架。所以这个bug的原因我也说不明白,但是确实把问题解决了,下面把解决方法说一下(其实也都是从网上搜的,稍加整理)

 

1、到delphi安装目录下,找到Source\VCL\AxCtrls.pas文件(这个文件中的代码有bug),拷贝到你的项目文件夹下,把这个文件添加为你项目的一部分(这样delphi就会应用你修改后的AxCtrls.pas)

 

2、找到AxCtrls.pas文件中的函数ParkingWindow,用下面的代码替换


  function   ParkingWindow:   HWND;  
  var  
      TempClass:   TWndClass;  
      ParkingName   :   String;  
  begin  
      Result   :=   xParkingWindow;   
      //if   Result   <>   0   then   Exit;   //这行代码在delphi5和delphi6中好像不用注释掉
    
      //   fix   Dax   error   :   accessviolation   (win2k,   win   xp)  
      ParkingName   :=   'DAXParkingWindow_'   +       Format('%p',   [@ParkingWindowProc]);  
   
      FillChar(TempClass,   sizeof(TempClass),   0);  
      if   not   GetClassInfo(HInstance,   PChar(ParkingName),   TempClass)   then   //   fix   Dax   error   :   accessviolation   (win2k,   win   xp)  
      begin  
          TempClass.hInstance   :=   HInstance;  
          TempClass.lpfnWndProc   :=   @ParkingWindowProc;  
          TempClass.lpszClassName   :=   PChar(ParkingName);   //   fix   Dax   error   :   accessviolation   (win2k,   win   xp)  
          if   Windows.RegisterClass(TempClass)   =   0   then  
              raise   EOutOfResources.Create(SWindowClass);  
      end;  
      xParkingWindow   :=   CreateWindowEx(WS_EX_TOOLWINDOW,   TempClass.lpszClassName,   nil,  
          WS_POPUP,   GetSystemMetrics(SM_CXSCREEN)   div   2,  
          GetSystemMetrics(SM_CYSCREEN)   div   2,   0,   0,   0,   0,   HInstance,   nil);  
      SetWindowPos(xParkingWindow,   0,   0,   0,   0,   0,   SWP_NOACTIVATE   or   SWP_NOREDRAW  
          or   SWP_NOZORDER   or   SWP_SHOWWINDOW);  
      Result   :=   xParkingWindow;  
  end;  

 

3、编译项目即可

posted @ 2009-07-08 17:01 唐工 阅读(927) 评论(0) 编辑


2009年7月2日

//写入信息

function WriteRegs(frm:TForm):boolean;
var
 wIni:Tinifile;
 i:integer;
begin
 wIni:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'RegDesc.ini');
 for   i:=   componentcount-1   downto   0   do
    begin
        if   IsPublishedProp(frm.Components[i],   'Caption')   then
             Wini.WriteString(frm.Name,frm.Components[i].Name,GetPropValue(components[i],'caption',false));
    end;
end;

//读取显示信息
function ReadRegs(frm:TForm):boolean;
var
 rIni:Tinifile;
 i:integer;
begin
 rIni:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'RegDesc.ini');
 for   i:=   componentcount-1   downto   0   do
    begin
        if   IsPublishedProp(Self.Components[i],   'Caption')   then
          begin
              SetPropValue(Self.Components[i],'Caption',rIni.ReadString(self.Name,Self.Components[i].Name,''));
          end;
    end;
end;

posted @ 2009-07-02 15:56 唐工 阅读(66) 评论(0) 编辑


posts - 6, comments - 6, trackbacks - 0, articles - 0

Copyright © 唐工