有个目标程序窗口上面有三个文本框,分别是T1,T2,T3,在输入T1后,当T1失去焦点或者按TAB键后,那个窗口会自动根据T1的值自动算出T2的值并在T2中显示,然后输入T3后,点确定按钮完成填单。我用Hook(Dll)监视目标窗口来实现自动填单,当目标窗口出现的时候,我用程序模拟输入T1,并对T1发送一个TAB按键(希望激活T1的焦点离开事件,并计算出T2的值),然后模拟输入T3,并模拟点击确定按钮,但那个窗口提示我T2不能为空值。看了一下,在错误提示出现的时候,T2确实没有值。分析了一下,应该是我用程序模拟操作太快了,虽然我给T1发送了TAB,但那个窗口还没来得及计算出来T2并且显示,我的钩子程序就已经输入T3并点击确定按钮了。我想在给T1发送TAB之后加一个小的延时(毫秒级就够了),但发现因为我的Hook Dll是加载到那个窗口程序的进程里的,所以我的Dll延时了,那个窗口程序也跟着延时了。等我钩子延时过了,那个窗口程序才恢复运行。这样的情况下,怎么在钩子里加延时呢?谢谢
从网上查了一下,没找到解决办法,所以还是跑来这里,看各路高手是否有好的解决办法。
不懂的,不能回答的,就别顶了,我会自己关注帖子,自己提前的,谢谢合作

解决方案 »

  1.   


    没看懂我的问题?问题是,你怎么在Hook里加这个延时。什么时候加不是问题。
      

  2.   

    不想麻烦就在dll里加个timer,在事件里一遍一遍做,想麻烦就用多线程
      

  3.   

    还有,照你这样说,不知道你发送消息是用send还是post计算过程是在消息处理里面还是在外面另外处理
      

  4.   

    这里面有些特殊情况,我不能去读取那个T2,而只能想办法保证T1的焦点离开事件被触发。
    也就是说,我现在就想知道怎么实现这个延时。
    CaiBirdy :
      你说的Timer的方法不行,因为无法给Timer事件传递我的一些特定参数。
      跟send还是post也没关系,因为post肯定不行,因为那样可能那个窗口程序反应更不及时,用send还有点希望。
      计算过程当然不在我的dll里,而是那个窗口程序的事情。
      

  5.   

    楼上,Sleep我当然知道,但是会造成目标窗口程序也一起延时。这点我帖子里已经说了。
      

  6.   

    hook自己起个进程,然后传递form句柄给该进程,在hook里写sleep就可以避免一起延时
      

  7.   


    Timer事件只是提供给你一个执行代码的机会,跟你要不要传递什么参数没关系,还有,既然你用send,如果在你的消息处理过程中加入计算过程,那肯定会等你的计算过程结束后才返回的。。
    只能说你肯定是在哪里出现错误的了。。
      

  8.   

    愁啊,好像这个问题无解呢。
    我是想在给T1发送TAB之后,让我的钩子处理函数等待500毫秒(目的是等T1失去焦掉事件执行完,这样T2才有值),然后才继续给T3发送文本但如果直接Sleep(500);的话,会导致那个T1失去焦点事件也在执行过程中暂停。
      

  9.   

    你是在hook。dll里做的吧!那你的执行思路是错的,send 'TAB' 后,就不做任何事了,直接返回,继续给T3发送文本的程序 是在你收到 “T2文本框值改变的消息后”(是什么消息我忘了)才继续执行。你直接sleep是不会收到效果的。
      

  10.   

    我没说计算跟你钩子的关系,是你计算过程是在主程序里的哪个地方激发的,算了,不跟你讨论计算过程的事情,也许那目标程序不是你自己开发的。这样子我觉得用个Timer足够了,一秒钟执行一个动作够了吧,第一次发送文本,第二次发送Tab,第三次发送输入t3,第四次确定,这样不够么
      

  11.   

    sleep会阻塞所有消息,还不如用一个循环+ProcessMessages来的灵活。。
      

  12.   

    除了以上各位说的这些,如果想直接加类似Sleep这样的延时,看来确定是没办法了?
    基于我这里的特殊情况,我不能使用CaiBirdy 说的timer那样的功能,也不能像jiju说的那样判断T2的状态
    我只想要,而且也只能要Dll里面延时,而不影响外部程序的运行的效果。也就是说就是要异步的效果。就好像我用EXE控制另外一个第三方程序,我的EXE里面延时并不会影响那个第三方程序运行那样。
      

  13.   

    那就创建线程吧
    createthread 也挺简单的在线程函数里做循环等待500毫秒,再执行输入T3。
    另外不知道你什么特殊情况,,能否给大家说下
      

  14.   

    哦,楼上的说法应该差不多。
    看来得去学习一下Delphi的线程了