Shell扩展:定制上下文菜单
_SUCCESS, FACILITY_NULL, (USHORT)(ID_COPY_PATH + 1))); } InvokeCommand方法:用来处理菜单项的命令: HRESULT STDMETHODCALLTYPE InvokeCommand( LPCMINVOKECOMMANDINFO lpici ) { //Ctrl键按下时拷贝的路径的"\"用"\\"代替,这样可 以直接应用在代码中 BOOL bCtrlPress = ( ( ::GetKeyState( VK_CONTROL ) & 0x8000 ) != 0 ); if( LOWORD( lpici->lpVerb ) == ID_COPY_PATH ) { //如果是拷贝文件路径菜单项 CString strClipboard(_T("")); for ( int nIndex = 0; nIndex < (int) m_arrFilePath.GetCount(); nIndex++ ) { //遍历选中的文件(夹)列表 CString strItem = m_arrFilePath.GetAt( nIndex ); if( bCtrlPress ) { //获取路径的代码格式 strItem.Replace( _T("\\"), _T ("\\\\") ); } //添加到总串并以换行结束 strClipboard.Append( strItem ); strClipboard.Append( _T("\r\n") ); } //拷贝进剪贴板 if( ::OpenClipboard( NULL ) ) { ::EmptyClipboard(); HGLOBAL hGlobal = GlobalAlloc( GPTR, ( strClipboard.GetLength() + 1 ) * sizeof( TCHAR ) ); LPTSTR lpszText = (LPTSTR)::GlobalLock( hGlobal ); if( lpszText != NULL ) { _tcscpy_s( lpszText, strClipboard.GetLength() + 1, strClipboard ); } ::SetClipboardData( CF_TEXT_FORMAT, hGlobal); ::GlobalUnlock( hGlobal ); ::CloseClipboard(); } } return S_OK; } GetCommandString方法:在此处用不到,简单地返回E_NOTIMPL即可. 程 序实现已完结,最后一步就是注册,需要在注册表的 HKEY_CLASSES_ROOT\*\ShellEx\ContextMenuHandlers\键一自己的键,并把键值 设为刚刚编写的COM的CLSID. 由于是用ATL实现,我只需在RGS文件的HKCR键下加上如下脚 本:
AAD8C1A8-017E-44B3-8271-DFBA4CD8E75C是我的 CLSID. 一切都已完成。希望大家愉快. PS: 我不知道博客园能不 能上传附件,如果有需要源码的朋友可以留下Email。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |