有个关于用Hook拦截窗口消息的钩子,现在遇到点困难,特来请教..

xiangding 2009-08-25 04:32:18
我写了个钩子,用的WH_CBT类型,在钩子函数中这样判断:

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
if (nCode == HCBT_ACTIVATE)
{
HWND hWnd= (HWND)wParam;
::SetWindowPos(hWnd, NULL, 100,100, 400,400, SWP_SHOWWINDOW);
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

我的目的是,当我的钩子被安装后,只允许所有窗口在100,100,400,400的屏幕坐标内运行。
我是这么做的:当用Hook拦截到被激活的消息时,我用SetWindowPos来改变它的窗口的大小和位置,控制到这个坐标内。

现在运行的结果是,其它窗口被激活时,能在这个坐标内。但系统窗口如windows的桌面,开始菜单等,只要收到WM_ACTIVATE消息时,也会跑到100,100,400,400这个坐标内去,
请问有办法只拦截普通的程序窗口,而不处理开始菜单,桌面等的消息吗?或者有其它合适的方法吗?



...全文
250 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangqing0827 2009-08-28
  • 打赏
  • 举报
回复
过滤一下进程
jasonM2008 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fishion 的回复:]
先记录菜单,桌面的进程信息,把其放到列表中,当响应消息时就把与这几个进程的消息过滤掉
[/Quote]
顶!过滤就可以了!
hlq83 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiangding 的回复:]
我肯定是用的全局钩子,

楼上的兄弟说: 根据注册的窗口类名去过滤,你可以用spy++查下系统窗口(桌面,开始菜单)的类名
这倒是可以实现,但是比较麻烦,

不知道有没有更实用简单点的方法?

[/Quote]

这个实现起来不麻烦吧
我是苦力 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tttyd 的回复:]
通过窗口的句柄,使用GetWindowThreadProcessId函数判断该进程是否为explore,如果是,则过滤掉.
[/Quote]
这个不行吗? 看起来最简单啊,为什么不用
maple_zhj 2009-08-26
  • 打赏
  • 举报
回复
全局钩子啊,
消息钩子。

我也觉得 只是用过滤。
chm_8611 2009-08-26
  • 打赏
  • 举报
回复
局部钩子,应该不会截获桌面消息和开始菜单消息,不知道楼主怎么实现的?可否赐教
  • 打赏
  • 举报
回复
spy 先确定类型
MoXiaoRab 2009-08-25
  • 打赏
  • 举报
回复
你只要做一张过滤的窗口类的列表不就好了,Spy++的使用你觉得困难?鼠标拖动一个图标拖动你不至于不会吧
MoXiaoRab 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiangding 的回复:]
我肯定是用的全局钩子,

楼上的兄弟说: 根据注册的窗口类名去过滤,你可以用spy++查下系统窗口(桌面,开始菜单)的类名
这倒是可以实现,但是比较麻烦,

不知道有没有更实用简单点的方法?

[/Quote]
这个还麻烦????????已经是简单得不能再简单了
xiangding 2009-08-25
  • 打赏
  • 举报
回复
我肯定是用的全局钩子,

楼上的兄弟说: 根据注册的窗口类名去过滤,你可以用spy++查下系统窗口(桌面,开始菜单)的类名
这倒是可以实现,但是比较麻烦,

不知道有没有更实用简单点的方法?
zoulie 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tr0j4n 的回复:]
在CBT钩子的CBTHookProc中,wParam参数就是新创建/激活的窗口的句柄,你这样进行强制转换

HWND hWnd=(HWND)wParam;

然后通过GetClassName获得这个窗口的类名,如果发现是“#32769(桌面)”的时候,就说明是桌面句柄,如果是“DV2ControlHost”,就说明是开始菜单,对他们不进行处理即可
[/Quote]
同意
找出这些窗口的类名,判断
hlq83 2009-08-25
  • 打赏
  • 举报
回复
根据注册的窗口类名去过滤,你可以用spy++查下系统窗口(桌面,开始菜单)的类名。
  • 打赏
  • 举报
回复
你是使用得局部钩子吗,应该不会呀
MoXiaoRab 2009-08-25
  • 打赏
  • 举报
回复
在CBT钩子的CBTHookProc中,wParam参数就是新创建/激活的窗口的句柄,你这样进行强制转换

HWND hWnd=(HWND)wParam;

然后通过GetClassName获得这个窗口的类名,如果发现是“#32769(桌面)”的时候,就说明是桌面句柄,如果是“DV2ControlHost”,就说明是开始菜单,对他们不进行处理即可
xiangding 2009-08-25
  • 打赏
  • 举报
回复
楼上的兄弟, 所有系统创建的进程,如桌面,开始菜单,都会是explore.exe创建的吗?
雪影 2009-08-25
  • 打赏
  • 举报
回复
通过窗口的句柄,使用GetWindowThreadProcessId函数判断该进程是否为explore,如果是,则过滤掉.
dirdirdir3 2009-08-25
  • 打赏
  • 举报
回复
很难区分吧,windows的一般都是控件的,其他用户也可以调用,很难区分出系统和一般的...........
ziplj 2009-08-25
  • 打赏
  • 举报
回复
....只能进行窗口判断了呗...
能截个图看看吗???我想看看你那是什么样子...桌面是不是超酷
fishion 2009-08-25
  • 打赏
  • 举报
回复
先记录菜单,桌面的进程信息,把其放到列表中,当响应消息时就把与这几个进程的消息过滤掉

16,471

社区成员

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

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

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