需要实现这样的功能
找到目标窗口然后在其内的输入域写入信息
在目标窗口按一个按钮并触发其事件

解决方案 »

  1.   

    买一本书来看吧
    《Advanced Windows》
    那里有Hook的
      

  2.   

    下面是一相鼠标全局钩子,只需稍微修改一下,就是键盘的了。引 :重庆 晨晨 钩子函数并不是什么高深的技术,在Microsoft的Win32 SDK手册上就有记述。不过很可惜秉承M$的一贯风格,要看懂可是不容易的事!而且它的例子是使用SDK写的,又不完整!这就让我们这些用只会Delphi的程序员更看不懂了。不过用钩子函数是很有用的,例如鼠标钩子可以拦截下所有的鼠标消息的。
    前段时间我写我的第一个软件《聊天快贴》的时候,学习了一下鼠标钩子函数,现在我把我几周的学习成果写出来希望对大家有帮助。
    钩子函数一共有12种(这里就不列举出来了,不过说实话我多数钩子也没有用过^_^),分为全局子和线程钩子两种。线程钩子就只监视某个线程,全局钩子可以监视Windows的所有线程。具体的你可以看看Delphi 带的Win32 SDK,就是是全英文的,可惜了。全局钩子是必须用DLL加载,也就是说钩子函数这部分必须包装为一个DLL文件,然后再在主程序中调用钩子DLL中函数才可以!而且有些钩子是必须以全局钩子的方式存在,也就是一定要用DLL包装它才可以。
    再解释一下设置钩子的Api函数:
    function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK; stdcall;这是在Delphi下的说明,其中第一个参数是钩子的类型;第二个参数是钩子函数的地址;第个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程;返回钩子句柄。如果指定了某个确定的线程就只监视那个线程,即是线程钩子;如果为空,即是监视所有线程的全局钩子。其它几个相关函数就没有什么讲的了,只要照着用就可以了。具体的看我的源程序吧! 
    另外如果你只想使用进程钩子的话,有一个现成的控件可以用,就是Rx的RxWindowHook控件。拖到你窗体上,设置Active为True就可以了。 然后他只有BeforeMessage(消息从消息队列取走前)和AfterMessage(消息从消息队列取走后)两个事件,响应他就可以了,怎么用就看你的了。
    下面我说说比较实用的全局钩子的使用!我写了一个最简单的鼠标全局钩子的例子,我还假定你懂如何写DLL。好了,来看源程序:(BTW:我学习编程技巧的时候总是想看一些最简单的例子,可是有些作者习惯用复杂的应用作为例子。学起来真是痛苦!!!)一、DLL的工程文件。
    library hookprj;uses
    SysUtils,
    Classes,
    hkprocunit in 'hkprocunit.pas';{$R *.RES}
    exports
    EnableMouseHook, //只要把这两个函数输出就可以了,
    DisableMouseHook;//不会不懂函数的意思吧^_^。
    beginend.二、DLL输出函数的实现单元。unit hkprocunit;interfaceuses
    Windows,Messages;var
    hHk: HHOOK;//钩子的句柄值。
    function MouseHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT;stdcall;
    //鼠标钩子的回调函数,即是用它来处理得到消息后要干什么。这里我只是发送一个//WM_PASTE消息。
    //nCode参数是Hook的标志,一般只关心小于0时。看下面的详细说明
    //WParam参数表示鼠标消息的类型
    //LParam参数是一个指向 TMOUSEHOOKSTRUCT 结构的指针。结构包含了鼠标消息的状态,我只用了hwnd一个
    //即鼠标消息要传递给的窗口句柄。
    //返回值如果不是0的话windows就把这个消息丢掉,其它的程序就不会再收到这个消息了。function EnableMouseHook:Boolean; stdcall; export;
    function DisableMouseHook:Boolean; stdcall; export;//两个函数都是Boolean类型,成功都是返回Trueimplementationfunction MouseHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT;stdcall;
    var
    MouseHookStruct: ^TMOUSEHOOKSTRUCT;//这个结构Delphi在Windows单元有定义,直接用就可以了。
    nState: SHORT;//得到键盘状态的GetKeyState函数的返回值。这是一个16位的数。 
    begin
    Result := 0; //最好首先给他一个返回值,不然会有警告的!记住这可不是C语言。
    //当nCode小于0时表示还有其它的Hook,必须把参数传给他。
    //此时就要用Api函数CallNextHookEx让他调用下一个Hook!!!当然不用好像也可以。 
    if nCode < 0 then 
    Result := CallNextHookEx(hHk,nCode,WParam,LParam)//参数是现成的,直接用就可以了,
    //详细的说明可以参考Win32 SDK
    else if wParam = WM_LBUTTONDBLCLK then //判断是不是鼠标左键双击事件
    begin
    nState := GetKeyState(VK_CONTROL);//这个函数只有一个参数,就是要得到的键的
    //键值,这里用windows的虚拟键值表示ctrl键。
    if (nState and $8000) = $8000 then//如果按下了,那么返回值的最高位为1
    begin //即是16进制的8000,如果没有按下就返回0
    MouseHookStruct := Pointer(LParam);//转换指针并付值给MouseHookStruct变量。
    SendMessage(MouseHookStruct.hwnd,WM_PASTE,0,0);//如果条件都满足了就发送WM_PASTE(粘贴)消息
    end;
    end;end;function EnableMouseHook:Boolean; stdcall; export;
    begin
    if hHk = 0 then //为了安全,必须判断一下再设置钩子。
    Begin 
    // 第三个参数的Hinstance 在Delphi中有定义,用就可以了。第四个参数必须为0
    hHk := SetWindowsHookEx(WH_MOUSE,@MouseHookProc,Hinstance,0);
    Result := True;
    end
    else
    Result := False;
    end;function DisableMouseHook:Boolean; stdcall; export;
    begin
    if hHk <> 0 then //如果有钩子就卸掉他。
    begin
    UnHookWindowsHookEx(hHk);
    hHk := 0;
    Result := True;
    end
    else
    Result := False;
    end;end.三、使用钩子的应用程序的工程文件。program Project1;uses
    Forms,
    Unit1 in 'Unit1.pas' {Form1};{$R *.RES}begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
    end.四、使用钩子的应用程序代码。unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, RxHook;type
    TForm1 = class(TForm)
    Button1: TButton;//放上两个Button和一个Edit控键用来试用我们的钩子函数。
    Button2: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;
    //下面是引用hookprj.dll中的函数。
    function EnableMouseHook:Boolean; stdcall; external 'Hookprj.dll' name 'EnableMouseHook';
    function DisableMouseHook:Boolean; stdcall; external 'Hookprj.dll' name 'DisableMouseHook';
    implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
    if EnableMouseHook then
    ShowMessage('启动钩子成功');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    if DisableMouseHook then
    ShowMessage('停止钩子成功');
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    //这里调用是必须的,否则有可能没有卸载钩子就退出了,那就不好了。 
    DisableMouseHook;
    end;
    end.Windows2000 + Delphi5.0sp1 测试通过好了讲完了,如果你还有什么问题的话可以email to me:[email protected]不过我也是菜鸟一个,太深了我也回答不了:( 不过大家可以讨论一下,共同进步! 还有如果你不想自己敲代码的话,可以到我的主页上下源程序http://suncw.boy.net.cn最后要感谢我学校的图书馆,如果不是它收藏了《Vc++ 4开发人员指南》和《Win32 SDK》这两套书的中文版的话我也不能如此快的学到如何使用钩子^_^
      

  3.   

    一个按键勾子:
    Intercepting The TAB and ENTER Keys{the prototype for the new keyboard hook function}
      function KeyboardHook(nCode: Integer; wParam: WPARAM;
                            lParam: LPARAM): LResult; stdcall;var
      Form1: TForm1;
      WinHook: HHOOK;    // a handle to the keyboard hook functionimplementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin  {install the keyboard hook function into the keyboard hook chain}
      WinHook:=SetWindowsHookEx(WH_KEYBOARD, @KeyboardHook, 0, GetCurrentThreadID);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      {remove the keyboard hook function from the keyboard hook chain}
      UnhookWindowsHookEx(WinHook);
    end;function KeyboardHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult;begin
      {if we can process the hook information...}
      if (nCode>-1) then
        {...was the TAB key pressed?}
        if (wParam=VK_TAB) then
        begin
          {if so, output a beep sound}
          MessageBeep(0);      {indicate that the message was processed}
          Result := 1;
        end
        else
        {...was the RETURN key pressed?}    if (wParam=VK_RETURN) then
        begin
          {if so, and if the key is on the up stroke, cause
          the focus to move to the next control}
          if ((lParam shr 31)=1) then
            Form1.Perform(WM_NEXTDLGCTL, 0, 0);      {indicate that the message was processed}
          Result := 1;
        end
        else
          {otherwise, indicate that the message was not processed.}      Result := 0
      else
        {we must pass the hook information to the next hook in the chain}
        Result := CallNextHookEx(WinHook, nCode, wParam, lParam);
    end;
      

  4.   

    你们不明白我的意思,我不需要一个MOUSE HOOK或者KETBOARD HOOK的例子,这样的例子到处都是,还有什么CBT HOOK的,ETC,我需要的是不是触发某一个键的按键,而是在特定的RUNNING的APPLICATION的FORM上一个输入域输入的内容,然后这个程序弹出子窗口什么的都可以捕获到,加以控制