使用Hook出了问题

iame 2001-07-20 07:45:52
最近从Java转到Windows上来,由于没有多少Windows平台经验,遇到一个问题无策了.问题是这样的:我想作一个例子,演示Locate Hook的用法,几乎相同的代码,截获Key和Mouse事件都正常,但截获GetMessage时出了问题:一按按钮开始截获消息,在IDE下,就把Delphi退出来,如果运行EXE,周围的程序都死光光。。。

请各位看一下是怎么一回事:
,下面是我的部分代码:

GetMessageHook:HHOOK;

//HOOK函数:(我想把拦截的消息显示在一个lbLog:ListBox中)

function GetMessageHookProc(code:Integer;wParam,lParam:LongInt):LongInt;stdcall;
const
LogStr='GetMessage code:%x,wParam:%x,hWnd:%x,message:%x,time:%d,X:%d,Y:%d';
var
temp:String;
cmsg:^MSG;
begin
Result:=0;
cmsg:=Ptr(lParam);
temp:=Format(LogStr,[code,wParam,cmsg.hwnd,cmsg.message,cmsg.time,cmsg.pt.x,cmsg.pt.y]);
HookForm.lbLog.items.add(temp);
if(code<0)then
Result:=CallNextHookEx(GetMessageHook,code,wParam,lParam);
end;

按钮的响应函数
procedure THookForm.bStartClick(Sender:TObject);
begin
GetMessageHook:=SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,hInstance,0);
end;

...全文
131 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
powerlee 2001-07-21
  • 打赏
  • 举报
回复
这个问题我是遇到过的,后来我解决的方法是这样,定义一个全局的动态数组,每个消息都保存在动态数组中,当UnHook之后再把消息取出显示。结果是可行的
xiaoxiao_8 2001-07-21
  • 打赏
  • 举报
回复
gz
BigBen 2001-07-21
  • 打赏
  • 举报
回复
hook的问题在delphi里不好解决,尤其是做成全局的时候。你可以参考以前的讨论。
我想可能的原因是,使用的是win98se,内核有了细微的变化而delphi5没有相应的变动。
别的版本没试用过,因为看sdk帮助,使用vc同样的程序是完全可以成功的。
xiaoxiao_8 2001-07-21
  • 打赏
  • 举报
回复
肯定死!WINDOWS那么多消息,你都接受,还循环,不死才怪呢???
njhhack 2001-07-21
  • 打赏
  • 举报
回复
use post message
powerlee 2001-07-20
  • 打赏
  • 举报
回复
问题可能是出在这条语句 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);
}

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧