利用钩子实现菜单阴影效果

也许有很多人曾和我一样, 对Office XP里面的菜单的阴影效果羡慕不已,它不需要在Windows XP 中就可以在菜单后面显示阴影, 当然在Windows XP中, 已经完全支持菜单阴影了。虽然我们不一定很有必要自己来实现这个较难实现的效果。但是正如有很多人想实现那种IE风格的菜单栏一样,尽管它 们并不能为我们带来更多实用的功能, 却可以使我们的程序看起来与众不同。:)

菜单也是一个窗口, 假如我们能得到它的窗口的句柄, 要实现像添加阴影这样的效果, 就不会很难了。可惜我们根本找不到这个窗口是在哪里被创建的,也没办法很容易地取得它的窗口句柄,甚至几乎难以相信它是一个窗口,因为我实在找不到它的窗口句柄啊。经过对许多别人已经做好的类的源代码的"研究", 我终于找到了一个方法。那就是万能的钩子,如果说在Windows里面抓"人",连钩子也办不到的话,那我就不知道该用什么方法实现了,呵呵。

下面我就一起来看看如何抓到这些"可恶"的家伙吧。为了便于移植,我们就写一个专用的类吧,就取名为CMenuWndHook。添加两个静态成员先:

static CMap m_WndMenuMap;
static HHOOK m_hMenuHook;

  被我们抓到的这些家伙肯定不止一个,我们需要一个映射模板类来保存它们的句柄和对应的CMenuWndHook 类对象的指针。m_hMenuHook则为我们将要创建的钩子的钩子句柄。再在CPP文件中初始化它们:

CMap CMenuWndHook::m_WndMenuMap;
HHOOK CMenuWndHook::m_hMenuHook = NULL;
下面再添加两个函数来做安装与卸载hook之用, 它们都是静态函数: void CMenuWndHook::InstallHook()
{
  if (m_hMenuHook == NULL)
  {
    m_hMenuHook = ::SetWindowsHookEx(WH_CALLWNDPROC,
                     WindowHook,
          AfxGetApp()->m_hInstance,
                    ::GetCurrentThreadId());
  }
}
Windows之下一般用上面的SetWindowsHookEx API函数来安装HOOK,它的函数原型如下:

时间: 2024-11-10 00:10:33

利用钩子实现菜单阴影效果的相关文章

Delphi中利用钩子实现QQ聊天窗口的修改

有人曾为公司不让用QQ.MSN等聊天工具而烦恼吗?看了下面的小程序你就会打消这种看法了. 当初公司做校园一卡通的项目时,里面的机房客户端需要用到系统的低级键盘钩子WH_KEYBOARD_LL,这也是我第一次接触到Windows中的Hook,因为WH_KEYBOARD_LL和其他钩子不一样,在Delphi的Windows帮助以及windows.pas文件中都没有定义,但microsoft的msdn中确有WH_KEYBOARD_LL的介绍,所以一路解决后就对Windows的系统钩子产生了兴趣.之后相

VC#利用钩子控制鼠标

工作中有这样的需求,某个控件panel的子控件textbox要实现只留鼠标右键copy,注意同时还不能影响其它panel的子控件textbox,怎么办? 答案是只有用钩子,在codeporject上找到这么一个钩子. 如图所示,第一个文本框只有copy功能. UserActivityHook.cs using System; using System.Runtime.InteropServices; using System.Reflection; using System.Threading;

svn利用钩子脚本功能实现代码同步到web目录

一.hook简单介绍     为了方便管理员控制提交的过程 ,Subversion提供了hook机制.当特定的 事件发生时,相应的 hook会被调用,hook其实就相当于特定事件的处理函数.每个hook会得到与它所处理的事件相关的参数,根据 hook的返回值,Subversion会决定是否继续当前的提交过程     要实际安装一个可用的钩子,你需要在 repos/hooks目录下安装一些与钩子同名(如 start-commit或者post-commit)的可执行程序或脚本. 二.本地机器SVN自

马士兵J2SE-第六章-常用类-基本数据类型包装类、Maths类、File类

基本数据类型包装类 public class test { public static void main(String[] args) { Integer i=new Integer(100); Double d=new Double("123.456"); int j=i.intValue()+d.intValue(); float f=i.floatValue()+d.floatValue(); System.out.println(j); System.out.println(

MFC自绘控件学习总结

前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或者有更好的方法,请不吝赐教. 我的机器环境是:Windows7旗舰版 Service Pack 1,Visual studio 2005 1).重绘某个控件时,强烈推荐使用子类化方法,比如想自绘Button控件, 首先添加自己的类CMYButton 继承自 CButton ,声明一个CMYButto

利用PPT打造手绘阴影效果的方法

  在本文中,Office办公助手的小编就详细讲讲利用PPT手工打造阴影效果的方法. 1.首先插入需要做阴影效果的图片,这里使用矩形代替. 2.接下来的阴影绘制有两种思路,先来看第一种:直接绘制.绘制一个新月形. 3.顺时针旋转90°,置于矩形下边缘,调整新月形的长度如图所示,填充灰色去掉边线. 4.双击新月形进入绘图格式-工具菜单,选择形状效果-柔化边缘并指定合适磅数. 5.拖动黄色节点调整阴影的形态,适当缩短新月形的长度,最终效果如下图所示: 6.将阴影置于底层即可.要点是新月形两端的尖角不

Windows的钩子机制详解_C 语言

一.概述: 了解windows程序设计的人都知道,Windows系统程序的运行是建立在消息传递机制的基础之上的,几乎所有的程序活动都由消息来驱动.钩子机制可以看作是一个消息的中转站,控制系统发出消息的处理和传递.利用钩子,我们可以截获系统发给应用程序的消息,并且在经过处理后决定是否将消息再发给下一个应用程序.利用钩子的这一特性,我们可以创建一个监控程序,收集和控制系统发出的消息. 二.Windows钩子程序的编制 编制Windows的钩子程序,需要用到几个SDK中的API函数.下面列出这几个函数

Delphi - 关于钩子函数HOOK

                                                            Delphi - 关于钩子函数HOOK (1)基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理它.钩子机制允许应用程序截获处理window消息或特定事件.钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息

Windows优化大师桌面菜单优化方法

  当我们的电脑使用久了以后,会发现,电脑运行越来越慢,很多人就会使用各种软件对电脑进行优化.不过却忘掉了一点,其实,桌面菜单优化后,电脑也是会变快的. 1.当 Windows 用户界面或其中组件异常时自动重新启动界面.此选项仅当Windows优化大师在Windows2000/XP/2003/Vista下运行时提供.勾选此项,当Windows用户界面或其中某一组件出现错误时,Windows用户界面将自动重新加载,建议选择. Windows优化大师 修改完成后,点击"优化",进行保存.