有个窗口标题设为AAA,我想过滤掉用户点击它右上方关闭按钮时的消息,也就是不让它关闭
我试着用钩子实现我这一想法,可试了好久都没成功,不知道怎么回事.
主要是回调函数部分我不知道写的对不对,大家帮我看一下.
LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT* cwp;
cwp = (CWPSTRUCT*)lParam;
if((cwp->hwnd == ::FindWindow(NULL,"AAA"))&&(cwp->message == WM_CLOSE))
{
    return 0;
}
else
{
    return CallNextHookEx(hhHook,nCode,wParam,lParam);
}
}我不知道参数到底应该怎么用,请大家帮忙.

解决方案 »

  1.   

    拦截WM_CLOSE是没有用的,对话框就不用这个消息,
    试试WM_DESTROY。
      

  2.   

    如果你不用DLL是不能拦别的程序的消息.
    如要你把findwindow那去掉,本程序就不能关掉了.
      

  3.   

    调用以下SetWindowLong来屏蔽掉系统的消息处理函数,实现自己的功能。实在不行,先截取鼠标点击,然后判断点击的坐标位置,如果不在关闭按钮区,则放行。否则屏蔽掉。方法有点笨,不妨试一试。:)
      

  4.   

    hook不能屏蔽消息,但是可以修改消息的
    所以
    if (cwp->message==WM_CLOSE)
        cwp->message = WM_NULL;
      

  5.   

    not use CallWndProc,you should use GetMsgProc. The GetMsgProc hook procedure can examine or modify the message
      

  6.   

    Hook 消息好像没有用吧,调用 DestroyWindow 的时候不管 WM_DESTROY 和 WM_NCDESTROY 返回什么值都不能取消销毁窗口的过程,可能的话建议 Hook DestroyWindow
      

  7.   

    对于你这个问题试试看 Hook WM_SYSCOMMAND 消息,点关闭按钮时系统会发送一个 WM_SYSCOMMAND 消息给窗口,默认消息处理过程在处理这个命令是会调用 DestroyWindow 来关闭窗口。
      

  8.   

    ...
    为什么要用hook呢。
    hook功能很强大,但是又不一定要用在这个上面。
    WM_CLOSE,直接disable不就可以了
      

  9.   

    TO: krfstudio
    非常感谢你的建议,我会试一下.TO: hifan
    问题是那个窗口不是我自己写的程序的,是另一个应用程序的,我没办法改它窗口的属性.