问题可能是出在这条语句 HookForm.lbLog.items.add(temp);
因为,你在做这个的时候,VCL也是通过Windows的消息来驱动lblog.刷新和增加条目等等,这个消息同样会流回到自己的Hook处理中,结果是消息风暴,当然会死掉。你可以参考 MSDN中关于HOOK的处理例程。
下面是其中一段
LRESULT CALLBACK GetMessageFunc (int nCode, WPARAM wParam, LPARAM lParam )
{
   MSG *lpMsg;
   HDC hDC;   if ( nCode >= 0 ) {
  lpMsg = (MSG *) lParam;
      wsprintf((LPSTR)szFilterLine[GETMESSAGEINDEX],
   "GETMESSAGE\tWnd:%d Time:%d  Point:%d %d %s                                  ",
       lpMsg->hwnd, lpMsg->time,
       lpMsg->pt.x, lpMsg->pt.y, szMessageString(lpMsg->message));
      hDC = GetDC(hwndMain);
      TabbedTextOut(hDC, 1, nLineHeight * GETMESSAGEINDEX,
    (LPSTR)szFilterLine[GETMESSAGEINDEX],
    strlen(szFilterLine[GETMESSAGEINDEX]), 0, NULL, 1);
      ReleaseDC(hwndMain, hDC);
   }   //
   // We looked at the message ... sort of processed it but since we are
   // looking we will pass all messages on to CallNextHookEx.
   //
   return CallNextHookEx(hhookHooks[GETMESSAGEINDEX], nCode, wParam, lParam);
}

解决方案 »

  1.   

    hook的问题在delphi里不好解决,尤其是做成全局的时候。你可以参考以前的讨论。
    我想可能的原因是,使用的是win98se,内核有了细微的变化而delphi5没有相应的变动。
    别的版本没试用过,因为看sdk帮助,使用vc同样的程序是完全可以成功的。
      

  2.   

    这个问题我是遇到过的,后来我解决的方法是这样,定义一个全局的动态数组,每个消息都保存在动态数组中,当UnHook之后再把消息取出显示。结果是可行的
      

  3.   

    肯定死!WINDOWS那么多消息,你都接受,还循环,不死才怪呢???