关于WH_CBT钩子中HCBT_DESTROYWND的问题

slmax1 2009-11-22 05:26:41
钩子类型采用的是WH_CBT
当nCode等于HCBT_DESTROYWND时,
if sTitle='SMYNES v1.20' then//这是一个FC模拟器程序
begin
ShowMessage('你关不了我的');
Result:=1;
end;

是否能够阻止程序关闭,我这里测式出来的是有些能而有些不能(关闭记事本时却能够正常阻止,但关闭EXE程序窗口的时候会出错,出错的顺序为 窗口消失------>ShowMessage('你关不了我的')触发--------->系统报错。)。
难道说程序在关闭的时候,向系统发送的不仅仅是销毁窗口,还有其它的消息?

还有一个问题,请大家观察WH_CBT

WH_CBT Hook

在以下事件之前,系统都会调用WH_CBT Hook子过程,这些事件包括:
1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;
2. 完成系统指令;
3. 来自系统消息队列中的移动鼠标,键盘事件;
4. 设置输入焦点事件;
5. 同步系统消息队列事件。

再看看我写的出错顺序,为什么会在窗口消失之后再触发ShowMessage,而不是之前?
...全文
260 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
slmax1 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hjkto 的回复:]
如上面的c代码
应该先DestroyWindow(hwnd); 销毁窗口
然后再PostQuitMessage(0); 停止消息循环,然后结束
当出现HCBT_DESTROYWND这个消息时,程序窗口已经销毁完了
此时的程序会向消息队列中发送一个PostQuitMessage(0); 停止消息循环,消息循环都停止了,程序当然结束了

[/Quote]

照你说的那样,那为什么当监视[记事本]的时候却能够成功。
hjkto 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 csshow 的回复:]
引用 4 楼 hjkto 的回复:
如上面的c代码
应该先DestroyWindow(hwnd); 销毁窗口
然后再PostQuitMessage(0); 停止消息循环,然后结束
当出现HCBT_DESTROYWND这个消息时,程序窗口已经销毁完了
此时的程序会向消息队列中发送一个PostQuitMessage(0); 停止消息循环,消息循环都停止了,程序当然结束了



照你说的那样,那为什么当监视[记事本]的时候却能够成功。

[/Quote]

我想可能是,你的哪个'SMYNES v1.20' 程序,在处理HCBT_DESTROYWND消息时,有其它的操作
gyk120 2009-11-23
  • 打赏
  • 举报
回复
记事本也是EXE,另外HCBT_DESTROYWND并不代表窗口已经销毁了,MSDN上的定义是“将要被销毁”,这个未被定义,值必须为0
贝隆 2009-11-22
  • 打赏
  • 举报
回复
学习
hjkto 2009-11-22
  • 打赏
  • 举报
回复
如上面的c代码
应该先DestroyWindow(hwnd); 销毁窗口
然后再PostQuitMessage(0); 停止消息循环,然后结束
当出现HCBT_DESTROYWND这个消息时,程序窗口已经销毁完了
此时的程序会向消息队列中发送一个PostQuitMessage(0); 停止消息循环,消息循环都停止了,程序当然结束了
hjkto 2009-11-22
  • 打赏
  • 举报
回复
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;

看看这个c的窗口过程
hjkto 2009-11-22
  • 打赏
  • 举报
回复
记号
gyk120 2009-11-22
  • 打赏
  • 举报
回复
HCBT_DESTROYWND可以收到消息,但是不知是不是此时窗体是否已经Destroy了,建议稳妥一点去截取WM_CLOSE消息

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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