have a glance , thank u.

解决方案 »

  1.   

    it's convenient, very good.
      

  2.   

    可惜在nt下不能平面http://www.codeproject.com/menu/trans_menu.asp
    上面这篇文章应该很有参考价值的
      

  3.   

    To kingcom_xu(刀是用来杀人的!)
    你的那篇看了,可惜是英文的,但是似乎和Zyl910实现Flat的全局Hook一样啊!
      

  4.   

    yes!对菜单过行子类化后去掉WS_EX_WINDOWEDGE,WS_EX_DLGMODALFRAME等扩展风格后就是平面的了在2000和XP下都没问题
      

  5.   

    不是全局HOOK吧。。
    只是对本进程进行hook
      

  6.   

    To kingcom_xu(刀是用来杀人的!)
    发段代码来看看?
      

  7.   

    http://www.codeproject.com/menu/trans_menu.asp中就有呀
     不过没有VB的
      

  8.   

    http://www.codeproject.com/menu/trans_menu.asp
    看起来方法与我的差不多,不知道什么地方是最关键的
    我这里不知道为什么Windows2000、WindowsXP总装不上
    没有办法修改
      

  9.   

    to:苹果.
    真的很不错.
    不过我有个问题....
    这个可以重绘 窗体..和 mdi 父窗体..
    但 mdi 子窗体 为什么不行...
      

  10.   

    mdi子窗体的菜单显示在mdi父窗体上.
    是在子窗体 load 之后才发生的.
    这个问题该怎么解决呢?
      

  11.   

    加图标直接改下CXPMenu里的DrawMenu应该就可以了
    Mdi子窗体倒没注意,研究下
      

  12.   

    修改了一下
    大家帮忙测试一下能不能在Windows2000、WindowsXP下运行http://cocgame.myetang.com/zyl910/flatmenu.zip
      

  13.   

    GOOD!
    不过在XP下会出现双重阴影...
    解决方法是在XP去掉类风格:CS_DROPSHADOW
      

  14.   

    to zyl910:
    WM_SPLWND是什么消息???
      

  15.   

    to:zyl910
    系统2000
    在ide 中 运行后退出.. 再次运行编译的.exe文件.然后就强制重起了..
    连非法操作都没有..晕...
      

  16.   

    WM_SPLWND我也不知道是什么
    以前在察看菜单窗口的消息的时候发现出现值为&H1E2的消息后菜单就会显示
    后来由于程序不能在Windows2000、WindowsXP下正常工作
    所以在看其他人写的XP阴影菜单程序
    发现它&H1E2将申明成WM_SPLWND
    所以我也顺便这样声明了
      

  17.   

    最开始用Hook+SubClass监控菜单窗口的消息
    由于不太稳定
    所以就改成完全用Hook
    没想到Windows2000、WindowsXP下不能正常运行
    只有改回Hook+SubClass我没有Windows2000、WindowsXP
    无法察看那时的菜单窗口的消息
    所以可能会出问题
      

  18.   

    HOOK是什么东西啊?我是新手啊!请各位大侠指点一二啊!
      

  19.   

    hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息
    ,并在消息到达目标过程前得到处理。 
    下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。 关于HOOKS 
    使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使
    用HOOK,并在消息处理完成后立即移去该HOOK。 
    HOOK链 
    WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOU
    SE HOOK用来监视鼠标消息。 
    WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数
    队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息
    ,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如
    果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于
    某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HO
    OK函数都会收到系统发送的消息) 
    HOOK过程 
    为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自
    己的HOOK函数。该函数语法如下: 
    public function MyHook(nCode,wParam,iParam) as long 
    ‘加入代码 
    end function 
    其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。
    wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作
    。 
    SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHook
    Ex函数将系统消息传递给HOOK链中的下一个函数。 
    [注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数
    中的CallNextHookEx语句将被忽略。 
    全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在
    DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在D
    LL中,也可以放置在应用程序的模块段)。 
    [注释] 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其
    它使用该类HOOK的应用程序产生冲突。 
    HOOK类型 
    WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK 
    WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在
    向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调
    用WH_CALLWNDPROCRET。 
    WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含
    了窗体过程处理系统消息后的一些信息。 
    WH_CBT Hook 
    系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令
    前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息
    队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,
    告诉系统,是否继续执行上面的操作。 
    WH_DEBUG HOOK 
    系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该
    HOOK决定是否让系统执行某种类型的HOOK。 
    WH_FOREGROUNDIDLE Hook 
    系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。 
    WH_GETMESSAGE Hook 
    WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序
    使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。 
    WH_JOURNALRECORD Hook 
    WH_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记
    录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用
    。 
    WH_JOURNALPLAYBACK Hook 
    ` WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回
    放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK 
    Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能
    在指定线程中使用。 
    WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时
    ,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。 
    WH_KEYBOARD Hook 
    WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 
    及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。 
    WH_MOUSE Hook 
    WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序
    使用该HOOK监视发送到消息队列中的鼠标输入。 
    WH_MSGFILTER and WH_SYSMSGFILTER Hooks 
    WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、
    对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_M
    SGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则
    可以在系统内监视所有应用程序的这些事件。 
    WH_SHELL Hook 
    一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或
    当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。 
    使用HOOK 
    安装、消毁HOOK过程 
    监视系统事件 安装、消毁HOOK过程 
    使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK
    ,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。 
    为了安装一个全局HOOK过程,必须在应用程序外建立一个DLL,并将该HOOK函数封装到其
    中,应用程序在安装全局HOOK过程时必须先得到该DLL模块的句柄。将DLL名传递给Load
    Library 函数,就会得到该DLL模块的句柄;得到该句柄 后,使用GetProcAddress函数
    可以得到HOOK过程的地址。最后,使用SetWindowsHookEx将HOOK过程的首址嵌入相应的
    HOOK链中,SetWindowsHookEx传递一个模块句柄,它为HOOK过程的进入点,线程标识符
    置为0,指出:该HOOK过程同系统中的所有线程关联。 
    以下是C写的例程,大家可以方便的转换为VB程序。 
    HOOKPROC hkprcSysMsg; 
    static HINSTANCE hinstDLL; 
    static HHOOK hhookSysMsg; 


    . hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll"); 
    hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc")

    hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER, 
    hkprcSysMsg, hinstDLL, 0); 
      

  20.   

    http://www.codeproject.com/menu/trans_menu.asp
    这个东西大家测试了吗?是不是有这么一种现象?
    当打开下拉菜单时有的是半透明的有的不是,而且直接点击开的下拉菜单不是透明的,要通过在菜单栏上点开一个菜单滑动到其他菜单上才是半透明的。这情况使我想起当出自己画菜单时的情形,也是这样有的正确有的不正确!我还深深的记得:在子类处理的代码中用GetBoundsRect时有的是可以的,有的就是Empty。也是一样:在菜单栏上点开的菜单得不到Rect,而通过滑动到的菜单才可以有相应的Rect。但的确是在WM_DRAWITEM中执行的。我的系统是Win2K Pro的。有这种情况的请关注一下!!!!!!!!!!!!!!!!!!!!!哪位高人能给指点一二,在下不胜感激。
      

  21.   

    我这里Windows98完全没有这个问题
    关键是我没有Windows2000分析