高分求解,Shell Menu的实现,内详

SoftDIY 2000-04-03 08:18:00
我希望在我的程序里实现windows点Start->program的菜单效果,即菜单项为各个目录和文件,且在该菜单点击右键又能弹出Explorer的Context Menu,请问如何实现,谢谢。
...全文
504 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgcat_6 2001-07-14
  • 打赏
  • 举报
回复
原来如此。。。。。。。!!!!!!!1
SoftDIY 2000-04-10
  • 打赏
  • 举报
回复
Sirius,多谢了,FastFolder果然是自己画的,我把焦点放在Fastfolder上,弹出Softice,用hwnd命令,果然是个popupmenu,不过ie的收藏夹菜单实实在在是个basebar。
我也自己画吧,骗人编得象就行。

sirius 2000-04-07
  • 打赏
  • 举报
回复
SoftDIY!!!
你害得我好惨!
一直以为fast folder真的可以弹出Basebar,用softice跟了十个多小时!
最后才发现....根本不是什么basebar!
而是:
1在QueryContextMenu里面InsertMenu,用MF_POPUP标志
2当焦点在menu上时search本目录的files,然后CreatePopupMenu
3用IShellFolder的iShellIcon找object的图标/名称
4InsertMenus,有几个shell object就有几个菜单项,自画风格的菜单,所以可以在旁边画icon
5当mouse点在下级菜单上时,立即用ishell接口再找到object的ContextMenu交给object缺省的接口处理
...
真是....不值得!害得我推迟了boss给的任务,,在最后才怀疑起来,编了个小程序
一查看,才发现其实只是个普通menu: #32768, 到处都是这种骗子, 模仿得真象!


sirius 2000-04-06
  • 打赏
  • 举报
回复
hehe,看来我又没有说清楚,怎么搞的! 讲话总是这样,我完了 :(

fast folder那个basebar其实就是系统的ContextMenu的下一级菜单,是用iContextMenu接口动态添加的. 秘密揭开,是不是很没劲儿?

SoftDIY 2000-04-06
  • 打赏
  • 举报
回复
Sirius,fast folder集成在右键菜单就跟前一段时间经常讨论的Winzip的右键菜单实现一样使用了Shell Extension,是IContextMenu的扩展,这并非本题难点。但Fast Folder后继的功能是我所不能得解的。
问题简化一下:如何实现IE中的收藏菜单,大家可以看到,你点了收藏菜单时,弹出的菜单实际上是basebar,在菜单项点右键,还会再出现一个Context Menu。
olo:Fast Folder可在www.desksoft.com下载
olo 2000-04-06
  • 打赏
  • 举报
回复
请问在哪儿下fast folder?
sirius 2000-04-06
  • 打赏
  • 举报
回复
今天down了那个fast folder,反编译了,觉得也没有什么了,原来就是用ishell Extension作的,大家仔细看文档吧
feelfree 2000-04-06
  • 打赏
  • 举报
回复
关注.
SoftDIY 2000-04-06
  • 打赏
  • 举报
回复
我的问题就是如何动态添加?
我也并非是想再做一个Fast Folder,比方说我有个"c:\"button,我想点击该button,就能弹出象fastfolder弹出c:\类似的菜单,当然最好不是自画的,而是系统的basebar
SoftDIY 2000-04-05
  • 打赏
  • 举报
回复
谢谢Lin,我这里也有VC的ShellTree源码,大概跟你的TShellTree差不多,不过它是Tree,我想我如果实在找不到Shell的接口函数,就将这Shell Tree改编成Shell Menu.不过正如Sirius所说,系统的开始菜单,IE3,IE4的windows不同,而且其实不能算是严格意义的菜单,而是一个复杂的窗口:BASEBAR,里面又有Syspager和Toolbar32,而且还是自画风格的.我自己写菜单也许会有未知的问题。
Fast Folder的菜单就是系统BASEBAR的菜单,说明应该有个SHELL接口的
「已注销」 2000-04-04
  • 打赏
  • 举报
回复
关注.
sirius 2000-04-04
  • 打赏
  • 举报
回复
太抱歉了,我还要补充说明"用共享内存加SendMessage的办法获得开始菜单项"的具体方法:

如果是在win9x下,
1)用
CreateFileMapping ( HANDLE(0xFFFFFFFF),
NULL, PAGE_READWRITE, 0, iFileSize, iFileName.c_str() );

MapViewOfFile( (HANDLE)Handle, AccessMode, 0, 0, iFileSize);
弄一块共享内存后,就可以和所有的进程共享啦!
2)FindWindowEx多次后得到startmenu里面的一个syspager,一个toolbar32,分别向它们
SendMessage(h,TB_BUTTONCOUNT,WPARAM(0),LPARAM(0))
得到菜单数目
SendMessage(h,TB_GETBUTTONTEXT,(WPARAM)ItemId[i],(LPARAM)(ShareMem->Address));

在安全的NT,共享内存不能单方面实施,所以SendMessage的后果往往是非法操作,但是你可以如此如此这般这般...
写一个简单的DLL,用SetWindowsHookEx,随便挂一个钩子,钩子函数里面什么都不要做...醉翁之意啦,只是想把DLL注入所有process而已

在DLL里面使用共享数据段:
#pragma comment(linker, "/SECTION:bss2,RWS")
#pragma data_seg("bss2")
DWORD ShareMem=NULL;
#pragma data_seg()
注意,数据必须带初始值.
然后在主程序里面把SendMessage的GETBUTTONTEXT接收地址改成
Dll里面的共享数据地址

大家还是上我的主页吧,看在我辛苦打字的份上----
http://cppsource.yeah.net

sirius 2000-04-04
  • 打赏
  • 举报
回复
真健忘,忘了说第3种办法:
1)用共享内存加SendMessage的办法获得开始菜单项
2)根据获得的菜单项动态修改自己的自画风格的menu
3)找到系统开始菜单(前面我说了方法的,注意:没有装IE4/5的Win95不同)
3)在每一个自己的菜单项被点击的响应函数里面,向startmenu的窗口发送鼠标点击消息...

总之,还是欺骗...
sirius 2000-04-04
  • 打赏
  • 举报
回复
如果要模仿开始菜单,比较难,到我的主页上down一个startmenu的模仿程序(可以运行但没有完全成功,没有时间写了)吧
http://cppsource.yeah.net

如果要实现Context Menu,要用到iShell Extension,
在codeproject里面的shell分类里面有完整教程:
The Complete Idiot's Guide to Writing Shell Extensions - Part I ~pART III

另外,系统的开始菜单,IE3,IE4的windows不同,而且其实不能算是严格意义的菜单,而是一个复杂的窗口:BASEBAR,里面又有Syspager和Toolbar32,而且还是自画风格的.如果要模仿显示效果还要模仿功能的话,不如这样偷懒:

寻找所有BASEBAR类的顶级窗口,窗口句柄数字最小的就是开始菜单(一般情况它是Hiden的),找到后,把它移动到需要的位置,然后show出来...我试验过, 完全可行!
sirius 2000-04-04
  • 打赏
  • 举报
回复
如果要模仿开始菜单,比较难,到我的主页上down一个startmenu的模仿程序(可以运行但没有完全成功,没有时间写了)吧

如果要实现Context Menu,要用到iShell Extension,
在codeproject里面的shell分类里面有完整教程:
The Complete Idiot's Guide to Writing Shell Extensions - Part I ~pART III

另外,系统的开始菜单,IE3,IE4的windows不同,而且其实不能算是严格意义的菜单,而是一个复杂的窗口:BASEBAR,里面又有Syspager和Toolbar32,而且还是自画风格的.如果要模仿显示效果还要模仿功能的话,不如这样偷懒:

寻找所有BASEBAR类的顶级窗口,窗口句柄数字最小的就是开始菜单(一般情况它是Hiden的),找到后,把它移动到需要的位置,然后show出来...我试验过, 完全可行!
olo 2000-04-04
  • 打赏
  • 举报
回复
关注
SoftDIY 2000-04-04
  • 打赏
  • 举报
回复
谢谢两位:
Lin:CoolMenu Pro是个Shareware呵,我没有银子:(而且好像它也没有实现Shell Menu。
Sirius:我问问题前已到codeguru和codetool(即codeproject)找过,不过恕我眼掘,没有找到相关源码,可否具体一点,多谢
sirius 2000-04-04
  • 打赏
  • 举报
回复
使用ishell接口,需要编写DLL,
msdn里面有示范.
你可以在www.codeguru.com或者www.codeproject.com的shell编程分类
里面下载到示范源程序.


--
好多源程序----http://cppsource.netease.net
Lin 2000-04-04
  • 打赏
  • 举报
回复
要是你用Delphi就好了,我有一个控件TShellTree,类似资源管理器,在磁盘、目录、文件...单击鼠标右键可以得到其上下文菜单。感兴趣的话,可与我联系。
SoftDIY 2000-04-04
  • 打赏
  • 举报
回复
大概我没有说清楚,大家不只用过Fast Folder没有,www.desksoft.com有当。
我想只有用Shell做最安全,且易于移植,如果Findwindow和SendMssage比较麻烦,不知有否现成的Shell 接口可弹出任意文件夹下的Shell Menu...
加载更多回复(1)

16,471

社区成员

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

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

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