PostMessage的消息的hook问题--WM_CLOSE

mayer 2011-04-01 08:03:27
1:目的:因为公司禁用了ocs的聊天消息保存,想自己写一个程序来保存聊天记录。(ps:ocs是一种类似msn等IM的通信工具)
2:原理:截获聊天窗口被关闭的消息,并保存窗口的聊天记录(模拟按键发送 ctrl+A ctrl+c,因为程序本身的原因,WM_GETTEXT不能使用,只能出此下策)
3:HOOK类型WH_CALLWNDPROC,主要code如下:

#pragma data_seg("Shared")
HHOOK hHook=NULL;
HINSTANCE hModule; //钩子函数所在模块的句柄
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws")

...
hHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)HookProc, hModule, 0);
...

//钩子回调函数
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
pCwp = (CWPSTRUCT *)lParam;

if (nCode < 0)
return CallNextHookEx(hHook,nCode,wParam,lParam);

if (pCwp && (WM_CLOSE == pCwp->message)
{
if (...) //这里根据窗口类名判断当前的消息是否是发给我需要的窗口的。窗口类名可以用spy++看到
{
...//do something
}
}

return CallNextHookEx(hHook,nCode,wParam,lParam);
}


4:问题:当使用鼠标点击聊天窗口的右上角的关闭和使用快捷键alt+F4进行窗口关闭的时候,可以正常截获WM_CLOSE消息,但是当按键盘esc键退出窗口的时候不能截获WM_CLOSE消息。使用spy++分析,发现按esc键的时候WM_CLOSE是由PostMessage发的,而点击窗口关闭的时候WM_CLOSE是由GetMessage发出的。
5:求助:请问各位大牛怎么才能截获按esc键而触发的WM_CLOSE,或者还有什么其他好的方式达到我的目的,非常感谢。
...全文
584 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mayer 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 aiwnx 的回复:]
不论是postmessage还是sendmessage,都会运行到该窗口的消息处理函数呀,直接hook住聊天窗口的处理函数不就可以了
还有,getmessage不是负责发送消息的,而是负责从消息队列按照一定规则获取消息的,楼主弄错了吧
[/Quote]

谢谢提醒,的确是搞错了,不是get,而是send
aiwnx 2011-04-01
  • 打赏
  • 举报
回复
不论是postmessage还是sendmessage,都会运行到该窗口的消息处理函数呀,直接hook住聊天窗口的处理函数不就可以了
还有,getmessage不是负责发送消息的,而是负责从消息队列按照一定规则获取消息的,楼主弄错了吧
mayer 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
捕获键盘钩子,WH_KEYBOARD,然后捕获ESC按键
[/Quote]

就是不太想搞两个hook,怕影响性能。
oyljerry 2011-04-01
  • 打赏
  • 举报
回复
捕获键盘钩子,WH_KEYBOARD,然后捕获ESC按键
fishion 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ytmayer 的回复:]
引用 1 楼 oyljerry 的回复:
捕获键盘钩子,WH_KEYBOARD,然后捕获ESC按键


就是不太想搞两个hook,怕影响性能。
[/Quote]
两个hook也没什么,俺也这样用过
Lactoferrin 2011-04-01
  • 打赏
  • 举报
回复
同时安装WH_CALLWNDPROC和WH_GETMESSAGE,前者针对send的,后者针对post的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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