XP菜单完整稳定解决方案! have a glance , thank u. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 it's convenient, very good. 可惜在nt下不能平面http://www.codeproject.com/menu/trans_menu.asp上面这篇文章应该很有参考价值的 To kingcom_xu(刀是用来杀人的!)你的那篇看了,可惜是英文的,但是似乎和Zyl910实现Flat的全局Hook一样啊! yes!对菜单过行子类化后去掉WS_EX_WINDOWEDGE,WS_EX_DLGMODALFRAME等扩展风格后就是平面的了在2000和XP下都没问题 不是全局HOOK吧。。只是对本进程进行hook To kingcom_xu(刀是用来杀人的!)发段代码来看看? http://www.codeproject.com/menu/trans_menu.asp中就有呀 不过没有VB的 http://www.codeproject.com/menu/trans_menu.asp看起来方法与我的差不多,不知道什么地方是最关键的我这里不知道为什么Windows2000、WindowsXP总装不上没有办法修改 to:苹果.真的很不错.不过我有个问题....这个可以重绘 窗体..和 mdi 父窗体..但 mdi 子窗体 为什么不行... mdi子窗体的菜单显示在mdi父窗体上.是在子窗体 load 之后才发生的.这个问题该怎么解决呢? 加图标直接改下CXPMenu里的DrawMenu应该就可以了Mdi子窗体倒没注意,研究下 修改了一下大家帮忙测试一下能不能在Windows2000、WindowsXP下运行http://cocgame.myetang.com/zyl910/flatmenu.zip GOOD!不过在XP下会出现双重阴影...解决方法是在XP去掉类风格:CS_DROPSHADOW to zyl910:WM_SPLWND是什么消息??? to:zyl910系统2000在ide 中 运行后退出.. 再次运行编译的.exe文件.然后就强制重起了..连非法操作都没有..晕... WM_SPLWND我也不知道是什么以前在察看菜单窗口的消息的时候发现出现值为&H1E2的消息后菜单就会显示后来由于程序不能在Windows2000、WindowsXP下正常工作所以在看其他人写的XP阴影菜单程序发现它&H1E2将申明成WM_SPLWND所以我也顺便这样声明了 最开始用Hook+SubClass监控菜单窗口的消息由于不太稳定所以就改成完全用Hook没想到Windows2000、WindowsXP下不能正常运行只有改回Hook+SubClass我没有Windows2000、WindowsXP无法察看那时的菜单窗口的消息所以可能会出问题 HOOK是什么东西啊?我是新手啊!请各位大侠指点一二啊! hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。 下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。 关于HOOKS 使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。 HOOK链 WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。 WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息) HOOK过程 为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。该函数语法如下: public function MyHook(nCode,wParam,iParam) as long ‘加入代码 end function 其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。 SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。 [注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。 全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。 [注释] 建议只在调试时使用全局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_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而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名传递给LoadLibrary 函数,就会得到该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); http://www.codeproject.com/menu/trans_menu.asp这个东西大家测试了吗?是不是有这么一种现象?当打开下拉菜单时有的是半透明的有的不是,而且直接点击开的下拉菜单不是透明的,要通过在菜单栏上点开一个菜单滑动到其他菜单上才是半透明的。这情况使我想起当出自己画菜单时的情形,也是这样有的正确有的不正确!我还深深的记得:在子类处理的代码中用GetBoundsRect时有的是可以的,有的就是Empty。也是一样:在菜单栏上点开的菜单得不到Rect,而通过滑动到的菜单才可以有相应的Rect。但的确是在WM_DRAWITEM中执行的。我的系统是Win2K Pro的。有这种情况的请关注一下!!!!!!!!!!!!!!!!!!!!!哪位高人能给指点一二,在下不胜感激。 我这里Windows98完全没有这个问题关键是我没有Windows2000分析 请教高手一个VB网络编程方面问题! 怎样在vb中调用IsContain函数 请问如果更改sstab中的各tab的颜色? 高分请教:如何用SHELL 打开一个用户输入的某一类型的文件。谢谢 请问,vb中如何连接上web,并post数据上去 与绘图有关的问题 如何读取ADO连接的ACCESS数据库中的表名?100分 特大新闻,Windows XP竟由Basic写成,大家觉得有可能吗? 如何READ TYPE LIBARY 中的接口信息. 大家快来看啊!!!!!! Excel如何在一个cell中引用自己写的函数 如何取得当前正在运行的应用程序列表?急待回复。
上面这篇文章应该很有参考价值的
你的那篇看了,可惜是英文的,但是似乎和Zyl910实现Flat的全局Hook一样啊!
只是对本进程进行hook
发段代码来看看?
不过没有VB的
看起来方法与我的差不多,不知道什么地方是最关键的
我这里不知道为什么Windows2000、WindowsXP总装不上
没有办法修改
真的很不错.
不过我有个问题....
这个可以重绘 窗体..和 mdi 父窗体..
但 mdi 子窗体 为什么不行...
是在子窗体 load 之后才发生的.
这个问题该怎么解决呢?
Mdi子窗体倒没注意,研究下
大家帮忙测试一下能不能在Windows2000、WindowsXP下运行http://cocgame.myetang.com/zyl910/flatmenu.zip
不过在XP下会出现双重阴影...
解决方法是在XP去掉类风格:CS_DROPSHADOW
WM_SPLWND是什么消息???
系统2000
在ide 中 运行后退出.. 再次运行编译的.exe文件.然后就强制重起了..
连非法操作都没有..晕...
以前在察看菜单窗口的消息的时候发现出现值为&H1E2的消息后菜单就会显示
后来由于程序不能在Windows2000、WindowsXP下正常工作
所以在看其他人写的XP阴影菜单程序
发现它&H1E2将申明成WM_SPLWND
所以我也顺便这样声明了
由于不太稳定
所以就改成完全用Hook
没想到Windows2000、WindowsXP下不能正常运行
只有改回Hook+SubClass我没有Windows2000、WindowsXP
无法察看那时的菜单窗口的消息
所以可能会出问题
,并在消息到达目标过程前得到处理。
下面将介绍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);
这个东西大家测试了吗?是不是有这么一种现象?
当打开下拉菜单时有的是半透明的有的不是,而且直接点击开的下拉菜单不是透明的,要通过在菜单栏上点开一个菜单滑动到其他菜单上才是半透明的。这情况使我想起当出自己画菜单时的情形,也是这样有的正确有的不正确!我还深深的记得:在子类处理的代码中用GetBoundsRect时有的是可以的,有的就是Empty。也是一样:在菜单栏上点开的菜单得不到Rect,而通过滑动到的菜单才可以有相应的Rect。但的确是在WM_DRAWITEM中执行的。我的系统是Win2K Pro的。有这种情况的请关注一下!!!!!!!!!!!!!!!!!!!!!哪位高人能给指点一二,在下不胜感激。
关键是我没有Windows2000分析