静默调用ShellContextMenu 实现QQ文件共享
2016-03-15 17:47
786 查看
我在CSDN提问题一直没人回复,一下午时间自己终于解决了问题
http://bbs.csdn.net/topics/391916381
现将过程录下
先说需求,我想实现的功能是 在程序中对文件调用百度网盘/qq的接口,发送给好友或上传到网盘,实现思路是右键菜单
现在我已经实现了在我的窗口中能够调出系统的右键菜单,并实现接口。
思路是 IShellFolder->ParseDisplayName 得到 文件到PIDL,IShellFolder->GetUIObjectOf() 得到IContextMenu 接口。
然后IContextMenu->QueryContextMenu() 得到菜单,再弹出菜单后,根据返回值调用 IContextMenu->InvokeCommand() 实现对文件的命令。
现在问题来了。
1. 在资源管理器中右键是有百度云盘的,但是在自己的窗口中没有。
2. 如何不弹出菜单,直接调用命令
3. 有可能右键菜单没有,但是QQShellExt YunShellExt 的COM接口还是存在的,有没有可能跳过ShellFolder->GetUiObjectOf 直接得到与云盘或QQ相关的 IContextMenu 或单独初始化一个。也就是有没有可能直接调用 QQShellExt 或 YunShellExt 的接口?
下面是我测试右键菜单的相关代码:
ShellContextMenu.h
View Code
此至,这条路完全跑通,明天开始整理相关代码,并测试这段代码对百度网盘的适应情况。
在CSDN盯了一下午,没有任何回复,沮丧。最后还是自己解决 。
http://bbs.csdn.net/topics/391916381
现将过程录下
先说需求,我想实现的功能是 在程序中对文件调用百度网盘/qq的接口,发送给好友或上传到网盘,实现思路是右键菜单
现在我已经实现了在我的窗口中能够调出系统的右键菜单,并实现接口。
思路是 IShellFolder->ParseDisplayName 得到 文件到PIDL,IShellFolder->GetUIObjectOf() 得到IContextMenu 接口。
然后IContextMenu->QueryContextMenu() 得到菜单,再弹出菜单后,根据返回值调用 IContextMenu->InvokeCommand() 实现对文件的命令。
现在问题来了。
1. 在资源管理器中右键是有百度云盘的,但是在自己的窗口中没有。
2. 如何不弹出菜单,直接调用命令
3. 有可能右键菜单没有,但是QQShellExt YunShellExt 的COM接口还是存在的,有没有可能跳过ShellFolder->GetUiObjectOf 直接得到与云盘或QQ相关的 IContextMenu 或单独初始化一个。也就是有没有可能直接调用 QQShellExt 或 YunShellExt 的接口?
下面是我测试右键菜单的相关代码:
ShellContextMenu.h
m_pContextMenu = GetContextMenuInterfaces(m_pParentFolder, m_idls); if (nullptr == m_pContextMenu) { ReleaseAll(); return false; } auto pContextMenu = m_pContextMenu; auto hr = m_pContextMenu->QueryInterface(IID_IContextMenu2, (void**)&m_pContextMenu2); if (S_OK == hr) { pContextMenu = m_pContextMenu2; } hr = pContextMenu->QueryInterface(IID_IContextMenu3, (void**)&m_pContextMenu3); if (S_OK == hr) { pContextMenu = m_pContextMenu3; } auto hMenu = ::CreatePopupMenu(); hr = pContextMenu->QueryContextMenu(hMenu, 0, CDM_FIRST, CDM_LAST, CMF_EXPLORE | CMF_NORMAL | CMF_ASYNCVERBSTATE); if (HRESULT_SEVERITY(hr) != SEVERITY_SUCCESS) { ReleaseAll(); return false; } auto nSel = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, pt->x, pt->y, hWnd, nullptr); if (0 == nSel) { auto error = ::GetLastError(); CString str; ::FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), str.GetBuffer(1024), 1024, NULL); str.ReleaseBuffer(); } DestroyMenu(hMenu); CString strCmd; hr = m_pContextMenu->GetCommandString(nSel - CDM_FIRST, GCS_VALIDATE | GCS_VERB | GCS_UNICODE, nullptr, (char*)strCmd.GetBuffer(1024), 1024); strCmd.ReleaseBuffer(); CString strHelpr; hr = m_pContextMenu->GetCommandString(nSel - CDM_FIRST,GCS_VALIDATE | GCS_HELPTEXT | GCS_UNICODE, nullptr, (char*)strHelpr.GetBuffer(1024), 1024); strHelpr.ReleaseBuffer(); // if (S_OK == hr) // { // InvokeCmd(m_pContextMenu, strCmd, m_strParentFolder); // } // if (nSel > 0) { InvokeCmd(pContextMenu, nSel, m_strParentFolder, pt); }
View Code
此至,这条路完全跑通,明天开始整理相关代码,并测试这段代码对百度网盘的适应情况。
在CSDN盯了一下午,没有任何回复,沮丧。最后还是自己解决 。
相关文章推荐
- shell 获取时间
- 用shell编程实现打印九九乘法表
- linux shell 系列 sed 命令基本用法实例-①set命令选项的应用案例
- -bash: ./scripts/mysql_install_db: /usr/bin/perl: bad interpreter: No such file
- 在windows下编辑好Shell脚本,在Linux中运行
- shell 批量删除垃圾数据
- shell【分发系统】
- 一些Linux shell
- 一些Linux shell
- Linux修改Shell命令提示符及颜色
- Linux shell
- Linux shell 脚本小记
- shell命令-read
- linuxshell 系列 sed 命令基本用法
- git bash使用(markdown版)
- windows server 2008 R2服务器无法通过ShellClass获取mp3音乐时长
- 手机离线Monkey测试(shell语言版)
- Shell重定向
- shell脚本:利用7z备份git项目
- Linux shell用法和技巧(转)