WH_CALLWNDPROC钩子怎么删除一个消息?

colordancer 2010-01-27 05:34:56
WH_CALLWNDPROC截获到某个消息后,不发送给某个窗口,即直接过滤掉,
应该怎么写?
...全文
569 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
colordancer 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jacky_qiu 的回复:]

首相 WH_CALLWNDPROC 截获的消息只用那些通过SendMessage的消息才可以监视到,像WM_LBUTTONDOWN是截获不到。


楼主我给你个最完整的解答,要给我加分哦。
WH_CALLWNDPROC类型的钩子专门用来截获通过SendMessage()函数发送到窗口的消息,不管是系统内部调用的SendMessage()函数还是用户进程中调用的SendMessage()……
[/Quote]

非常感谢你的回复。
可是我没法给你加分了。。抱歉。
jacky_qiu 2010-10-13
  • 打赏
  • 举报
回复
首相 WH_CALLWNDPROC 截获的消息只用那些通过SendMessage的消息才可以监视到,像WM_LBUTTONDOWN是截获不到。


楼主我给你个最完整的解答,要给我加分哦。
  WH_CALLWNDPROC类型的钩子专门用来截获通过SendMessage()函数发送到窗口的消息,不管是系统内部调用的SendMessage()函数还是用户进程中调用的SendMessage()函数。SendMessage()把消息直接交给窗口过程WndProc()来处理,WndProc()处理完消息后SendMessage()函数才返回(return resultValue;).如果设置了WH_CALLWNDPROC类型的钩子,则当SendMessage()把消息交给WndProc时,在WndProc尚未执行前,系统调用CallWndProc钩子函数,钩子函数执行后才执行窗口过程WndProc。
  上面所说的“发送消息”与“寄送消息”相对应,发送消息是SendMessage(),寄送消息是PoseMessage(),PostMessage把消息发送到程序的消息队列,而不是直接交给窗口过程WndProc。寄送的消息由窗口过程WndProc自动到消息队列中去取,用GetMessage()函数。
  一般来说,键盘消息与鼠标消息都是通过PostMessge函数寄送到程序消息队列中的,所以楼主不明白的地主就在这里了。
colordancer 2010-01-29
  • 打赏
  • 举报
回复
换了角度去实现,结贴
wltg2001 2010-01-28
  • 打赏
  • 举报
回复
试试WH_CBT钩子
colordancer 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wltg2001 的回复:]
MSDN原文:
The CallWndProc hook procedure can examine the message, butit cannot modify it. After the hook procedure returns control to the system, the message is passed to the window procedure.

换句话说WM_CALLWNDPROC能监视消息,但是不能更改它,改成WH_GETMESSAGE钩子吧

[/Quote]

我一开始就是试的WH_GETMESSAGE,但是问题是这个钩子截获不到WM_CLOSE消息
wltg2001 2010-01-28
  • 打赏
  • 举报
回复
MSDN原文:
The CallWndProc hook procedure can examine the message, but it cannot modify it. After the hook procedure returns control to the system, the message is passed to the window procedure.

换句话说WM_CALLWNDPROC能监视消息,但是不能更改它,改成WH_GETMESSAGE钩子吧
colordancer 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lenovo_ 的回复:]
在钩子函数中


C/C++ code
LRESULT CALLBACK HoocPro(int nCode,WPARAM wParam,LPARAM lParam)
{return1;
}
[/Quote]

我的代码如下:主要功能就是屏蔽外界发来的关闭消息。我return 1之后,窗口还是会被关闭。


LRESULT CALLBACK MessageProc(int code,WPARAM wParam,LPARAM lParam)
{

PCWPSTRUCT pMsg = (PCWPSTRUCT)lParam;


if (HC_ACTION == code)
{
if (pMsg->hwnd == g_hDlgWnd)
{
TRACE(_T("%u\r\n"),pMsg->message);
switch(pMsg->message)
{
case WM_CLOSE:
//case WM_DESTROY:
if (InSendMessage())
{
AfxMessageBox(L"Invalid Close");
return 1;
}
break;
}
}

}

return CallNextHookEx(g_hMsgHook,code,wParam,lParam);
}

BOOL HookCloseMessage()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
g_hMsgHook = SetWindowsHookEx(WH_CALLWNDPROC,MessageProc,AfxGetInstanceHandle(),0);

return g_hMsgHook == NULL ? FALSE : TRUE;
}
colordancer 2010-01-28
  • 打赏
  • 举报
回复
多谢楼上几位,我试一下,ok了就给分
colordancer 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wltg2001 的回复:]
试试WH_CBT钩子
[/Quote]

I tried
但是WH_CBT没办法活得消息的详细信息,也就没办法判断消息是本身进程内发出的,还是其他发出的,所以也就没法达到我的目的了
鬼90 2010-01-27
  • 打赏
  • 举报
回复
return 1,就不用CALLNEXTHOOK了.
LENOVO_ 2010-01-27
  • 打赏
  • 举报
回复
在钩子函数中



LRESULT CALLBACK HoocPro(int nCode,WPARAM wParam,LPARAM lParam)
{
return 1;
}


LENOVO_ 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangk 的回复:]
直接return 0;
[/Quote]

返回 0 ,消息会继续传递下去。

必须返回 1

return 1;
PointertoPointer 2010-01-27
  • 打赏
  • 举报
回复
我前天想学勾子,可碰到了模板问题,没学成,
我昨天打算学勾子,可又碰到了ACitivX ,没学成,
我唯一能做的就是帮你顶贴子
wangk 2010-01-27
  • 打赏
  • 举报
回复
直接return 0;
三:程序的设计: I:设置钩子 设置钩子是通过SetWindowsHookEx ()的API函数. 原形: HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId) idhook:装入钩子的类型. lpfn: 钩子进程的入口地址 hMod: 应用程序的事件句柄 dwThreadId: 装入钩子的线程标示 参数: idHook: 这个参数可以是以下值: WH_CALLWNDPROCWH_CALLWNDPROCRET、WH_CBT、WH_DEBUG、WH_FOREGROUNDIDLE、WH_GETMESSAGE、WH_JOURNALPLAYBACK、WH_JOURNALRECORD、WH_KEYBOARD、 WH_KEYBOARD_LL、WH_MOUSE、WH_MOUSE_LL、WH_MSGFILTER、WH_SHELL、WH_SYSMSGFILTER。 对于这些参数,我不想一一加以解释,因为MSDN中有关于他们的详细注解。我只挑选其中的几个加以中文说明。 WH_KEYBOARD:一旦有键盘敲打消息(键盘的按下、键盘的弹起),在这个消息被放在应用程序的消息队列前,WINDOWS将会调用你的钩子函数。钩子函数可以 改变和丢弃键盘敲打消息WH_MOUSE:每个鼠标消息在被放在应用程序的消息队列前,WINDOWS将会调用你的钩子函数。钩子函数可以改变和丢弃鼠标消息WH_GETMESSAGE:每次当你的应用程序调用一个GetMessage()或者一个PeekMessage()为了去从应用程序的消息队列中要求一个消息时,WINDOWS都会调用你的钩子函数。 而钩子函数可以改变和丢弃这个消息。 II:释放钩子 钩子的释放使用的是UnhookWindowsHookEx()函数 原形:BOOL UnhookWindowsHookEx( HHOOK hhk ) UnhookWindowsHookEx()函数将释放的是钩子链中函数SetWindowsHookEx所装入的钩子进程。 hhk: 将要释放的钩子进程的句柄。 III:钩子进程 钩子进程使用函数HookProc;其实HookProc仅仅只是应用程序定义的符号。比如你可以写成KeyBoardHook.但是参数是不变的。Win32 API提供了诸如:CallWndProc、 GetMsgProc、DebugProc、CBTProc、MouseProc、KeyboardProc、MessageProc等函数,对于他们的详细讲解,可以看MSDN我在此只讲解一下KeyBoardHook的含义。 原形:LRESULT CALLBACK KeyBoardHook (int nCode, WPARAM wParam, LPARAM lParam) 说明:钩子进程是一些依附在一个钩子上的一些函数,因此钩子进程只被WINDOWS调用而不被应用程序调用,他们有时就需要作为一个回调函数(CALLBACK)。 参数说明: nCode:钩子代码,钩子进程使用钩子代码去决定是否执行。而钩子代码的值是依靠钩子的种类来定的。每种钩子种类都有他们自己一系列特性的代码。比如对于WH_KEYBOARD, 钩子代码的参数有:HC_ACTION,HC_NOREMOVE。HC_ACTION的意义:参数wParam 和lParam 包含了键盘敲打消息的信息,HC_NOREMOVE的意义:参数wParam 和lParam包含了 键盘敲打消息的信息,并且,键盘敲打消息一直没有从消息队列中删除。(应用程序调用PeekMessage函数,并且设置PM_NOREMOVE标志)。也就是说当nCode等于HC_ACTION时, 钩子进程必须处理消息。而为HC_NOREMOVE时,钩子进程必须传递消息给CallNextHookEx函数,而不能做进一步的处理,而且必须有CallNextHookEx函数的返回值。 wParam:键盘敲打所产生的键盘消息,键盘按键的虚拟代码。 lParam:包含了消息细节。 注意:如果钩子进程中nCode小于零,钩子进程必须返回(return) CallNextHookEx(nCode,wParam,lParam);而钩子进程中的nCode大于零,但是钩子进程并不处理消息, 作者推荐你调用CallNextHookEx并且返回该函数的返回值。否则,如果另一个应用程序也装入WH_KEYBOARD 钩子,那么该钩子将不接受钩子通知并且返回一个不正确的值。 如果钩子进程处理了消息,它可能返回一个非零值去阻止系统传递该信息到其它剩下的钩子或者windows进程。所以最好在钩子进程的最后都返回CallNextHookEx的返回

16,472

社区成员

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

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

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