问题可能是出在这条语句 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);
}
因为,你在做这个的时候,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);
}
我想可能的原因是,使用的是win98se,内核有了细微的变化而delphi5没有相应的变动。
别的版本没试用过,因为看sdk帮助,使用vc同样的程序是完全可以成功的。