我有编程基础,但没用过DELPHI。现在有个任务需要做个钩子程序:向运行中的另一个win程序的编辑控件里写文本,然后触发一个按钮的单击事件。哪位大哥耐烦手把手教小弟完成这个工作,一定开贴800分重谢!

解决方案 »

  1.   

    写过很多,其实也很简单,大概说个程序结构,你自己再研究吧,有问题你再问,手把手教是没时间了。
    首先设置钩子
    HHOOK SetWindowsHookEx(
      int idHook,        // hook type //钩子类型自己看MSDN文档
      HOOKPROC lpfn,     // hook procedure //指向自己的函数
      HINSTANCE hMod,    // handle to application instance
      DWORD dwThreadId   // thread identifier
    );
    然后写个函数,该函数主要有3个参数(UINT nCode, WPARAN wParam, LPARAM lParam),返回类型为LONG,然后在该函数里堆第一个参数nCode进行判断,然后做相应的处理,然后调用
    LRESULT CallNextHookEx(
      HHOOK hhk,      // handle to current hook
      int nCode,      // hook code passed to hook procedure
      WPARAM wParam,  // value passed to hook procedure
      LPARAM lParam   // value passed to hook procedure
    );
      

  2.   

    感谢楼上大哥,不过小弟愚钝,看哪位再帮帮?
    Wyj:本机上有个程序正运行,界面上有一文本编辑控件和按钮,我就是想用DELPHI做的程序向文本编辑控件里写文字,然后触发按钮。
      

  3.   

    如果只是这样,有必要用钩子吗
    直接发消息不就可以了吗
    首先找到你的目标句柄(文本编辑控件和按钮的句柄)
    怎么找句柄?你不会不知道吧,用API,FindWindow,GetWindow或者回调函数EnumWindowsProc,自己看msnd文档吧
    然后发送相应的消息
    对于文本编辑控件
    SendMessage(target_handle, WM_SETTEXT, 0, LPARAM(your_string));
    对于按钮
    SendMessage(target_handle, BM_CLICK, 0, 0);
    或者
    PostMessage(target_handle, WM_LBUTTONDOWN, 0, 0);
    PostMessage(target_handle, WM_LBUTTONUP, 0, 0);
      

  4.   

    给你写段代码吧,现在有点空闲,自己修改吧,在这里写的,没调试过
    var
      hWin       :HWND;
      hCom       :HWND;
      hTxt       :HWND;
      hBtn       :HWND;
      value      :String;
      className  :String;
      caption    :String;
    begin
      hWin := FindWindow(NULL, "你的窗口的名字(Form's caption)"); //获得窗口句柄
      hCom := GetWindow(hWin, GW_CHILD);
      while (hCom <> NULL)
      begin
        GetWindowClass(hCom, className, 50); //取得子窗口类名字
        GetWindowText(hCom, caption, GetWindowTextLength(hCom)+1); //取得子窗口名字
        //可以通过类名字或窗口名字判断是不是所寻找的目标句柄
        if (className == 文本编辑控件类(delphi里一般是'TEdit',其他自己查))
        begin
          hTxt := hCom;
        end else if (className == 按钮类(delphi里一般是'TButton',其他自己查))
        begin
          hBtn := hCom;
        end;
        {或者用名字去查找,不过一般害怕有重名
        if (caption == your_exit_caption)
        begin
          hTxt := hCom;
        end else if (caption == your_button_cation)
        begin
          hBtn := hCom;
        end;
        }
        hCom = GetWindow(hCom, GW_HWNDNEXT);
      end;
      value := your_string; //你要设置的文字
      if (hTxt <> NULL)
      begin
          SendMessage(hTxt, WM_SETTEXT, 0, LPARAM(value));
          if (hBtn <> NULL)
          begin
            SendMessage(hBtn, BM_CLICK, 0, 0);
          end;
      end;
    end;
    这个大概可以满足你的要求,试试看,不过我好久没用delphi了,不知道变量类型什么的是不是合法,你自己再调试修改吧
      

  5.   

    很有点像我朋友做的QQ尾巴发送机制的问题:
    给你个网址,你去看看吧:
    http://dev.csdn.net/develop/article/24/24144.shtm
    其实很简单的.
      

  6.   

    我做过一个VC的源程序,可以将一个全局钩子嵌入指定的线程里,如Explorer.exe, 如果想要可以给你。