📄 shv_bg_cmenu.c
字号:
}
if (psfFrom)
{
/* get source and destination shellfolder */
IPersistFolder2 *ppfdst = NULL;
IPersistFolder2 *ppfsrc = NULL;
IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppfdst);
IShellFolder_QueryInterface(psfFrom, &IID_IPersistFolder2, (LPVOID*)&ppfsrc);
TRACE("[%p,%p]\n",ppfdst,ppfsrc);
/* do the link/s */
/* hack to get desktop path */
if ( (ppfdst && ppfsrc) || (This->bDesktop && ppfsrc) )
{
int i;
char szSrcPath[MAX_PATH];
char szDstPath[MAX_PATH];
BOOL ret = FALSE;
LPITEMIDLIST pidl2;
char filename[MAX_PATH];
char linkFilename[MAX_PATH];
char srcFilename[MAX_PATH];
IPersistFolder2_GetCurFolder(ppfsrc, &pidl2);
SHGetPathFromIDListA (pidl2, szSrcPath);
if (This->bDesktop)
{
SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &pidl2);
SHGetPathFromIDListA (pidl2, szDstPath);
}
else
{
IPersistFolder2_GetCurFolder(ppfdst, &pidl2);
SHGetPathFromIDListA (pidl2, szDstPath);
}
for (i = 0; i < lpcida->cidl; i++)
{
_ILSimpleGetText (apidl[i], filename, MAX_PATH);
TRACE("filename %s\n", filename);
lstrcpyA(linkFilename, szDstPath);
PathAddBackslashA(linkFilename);
lstrcatA(linkFilename, "Shortcut to ");
lstrcatA(linkFilename, filename);
lstrcatA(linkFilename, ".lnk");
TRACE("linkFilename %s\n", linkFilename);
lstrcpyA(srcFilename, szSrcPath);
PathAddBackslashA(srcFilename);
lstrcatA(srcFilename, filename);
TRACE("srcFilename %s\n", srcFilename);
ret = DoLink(srcFilename, linkFilename);
if (ret)
{
SHChangeNotify(SHCNE_CREATE, SHCNF_PATHA, linkFilename, NULL);
}
}
}
if(ppfdst) IPersistFolder2_Release(ppfdst);
if(ppfsrc) IPersistFolder2_Release(ppfsrc);
IShellFolder_Release(psfFrom);
}
_ILFreeaPidl(apidl, lpcida->cidl);
SHFree(pidl);
/* release the medium*/
ReleaseStgMedium(&medium);
}
IDataObject_Release(pda);
}
return bSuccess;
}
/**************************************************************************
* DoPaste
*/
static BOOL DoPaste(
IContextMenu2 *iface)
{
BgCmImpl *This = (BgCmImpl *)iface;
BOOL bSuccess = FALSE;
IDataObject * pda;
TRACE("\n");
if(SUCCEEDED(OleGetClipboard(&pda)))
{
STGMEDIUM medium;
FORMATETC formatetc;
TRACE("pda=%p\n", pda);
/* Set the FORMATETC structure*/
InitFormatEtc(formatetc, RegisterClipboardFormatA(CFSTR_SHELLIDLIST), TYMED_HGLOBAL);
/* Get the pidls from IDataObject */
if(SUCCEEDED(IDataObject_GetData(pda,&formatetc,&medium)))
{
LPITEMIDLIST * apidl;
LPITEMIDLIST pidl;
IShellFolder *psfFrom = NULL, *psfDesktop;
LPIDA lpcida = GlobalLock(medium.u.hGlobal);
TRACE("cida=%p\n", lpcida);
apidl = _ILCopyCidaToaPidl(&pidl, lpcida);
/* bind to the source shellfolder */
SHGetDesktopFolder(&psfDesktop);
if(psfDesktop)
{
IShellFolder_BindToObject(psfDesktop, pidl, NULL, &IID_IShellFolder, (LPVOID*)&psfFrom);
IShellFolder_Release(psfDesktop);
}
if (psfFrom)
{
/* get source and destination shellfolder */
ISFHelper *psfhlpdst, *psfhlpsrc;
if (This->bDesktop)
{
/* unimplemented
SHGetDesktopFolder(&psfDesktop);
IFSFolder_Constructor(psfDesktop, &IID_ISFHelper, (LPVOID*)&psfhlpdst);
IShellFolder_QueryInterface(psfhlpdst, &IID_ISFHelper, (LPVOID*)&psfhlpdst);
*/
IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlpdst);
}
else
{
IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlpdst);
}
IShellFolder_QueryInterface(psfFrom, &IID_ISFHelper, (LPVOID*)&psfhlpsrc);
/* do the copy/move */
if (psfhlpdst && psfhlpsrc)
{
ISFHelper_CopyItems(psfhlpdst, psfFrom, lpcida->cidl, (LPCITEMIDLIST*)apidl);
}
if(psfhlpdst) ISFHelper_Release(psfhlpdst);
if(psfhlpsrc) ISFHelper_Release(psfhlpsrc);
IShellFolder_Release(psfFrom);
}
_ILFreeaPidl(apidl, lpcida->cidl);
SHFree(pidl);
/* release the medium*/
ReleaseStgMedium(&medium);
}
IDataObject_Release(pda);
}
return bSuccess;
}
/**************************************************************************
* ISVBgCm_fnInvokeCommand()
*/
static HRESULT WINAPI ISVBgCm_fnInvokeCommand(
IContextMenu2 *iface,
LPCMINVOKECOMMANDINFO lpcmi)
{
BgCmImpl *This = (BgCmImpl *)iface;
LPSHELLBROWSER lpSB;
LPSHELLVIEW lpSV = NULL;
HWND hWndSV = 0;
TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd);
/* get the active IShellView */
if((lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0)))
{
if(SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV)))
{
IShellView_GetWindow(lpSV, &hWndSV);
}
}
if(HIWORD(lpcmi->lpVerb))
{
TRACE("%s\n",lpcmi->lpVerb);
if (! strcmp(lpcmi->lpVerb,CMDSTR_NEWFOLDERA))
{
DoNewFolder(iface, lpSV);
}
else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWLISTA))
{
if(hWndSV) SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 );
}
else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWDETAILSA))
{
if(hWndSV) SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 );
}
else
{
FIXME("please report: unknown verb %s\n",lpcmi->lpVerb);
}
}
else
{
switch(LOWORD(lpcmi->lpVerb))
{
case FCIDM_SHVIEW_REFRESH:
if (lpSV) IShellView_Refresh(lpSV);
break;
case FCIDM_SHVIEW_NEWFOLDER:
DoNewFolder(iface, lpSV);
break;
case FCIDM_SHVIEW_INSERT:
DoPaste(iface);
break;
case FCIDM_SHVIEW_INSERTLINK:
MakeLink(iface);
break;
case FCIDM_SHVIEW_PROPERTIES:
if (This->bDesktop) {
ShellExecuteA(lpcmi->hwnd, "open", "rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL);
} else {
FIXME("launch item properties dialog\n");
}
break;
default:
/* if it's an id just pass it to the parent shv */
if (hWndSV) SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0),0 );
break;
}
}
if (lpSV)
IShellView_Release(lpSV); /* QueryActiveShellView does AddRef */
return NOERROR;
}
/**************************************************************************
* ISVBgCm_fnGetCommandString()
*
*/
static HRESULT WINAPI ISVBgCm_fnGetCommandString(
IContextMenu2 *iface,
UINT_PTR idCommand,
UINT uFlags,
UINT* lpReserved,
LPSTR lpszName,
UINT uMaxNameLen)
{
BgCmImpl *This = (BgCmImpl *)iface;
TRACE("(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
/* test the existence of the menu items, the file dialog enables
the buttons according to this */
if (uFlags == GCS_VALIDATEA)
{
if(HIWORD(idCommand))
{
if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) ||
!strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) ||
!strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA))
{
return NOERROR;
}
}
}
FIXME("unknown command string\n");
return E_FAIL;
}
/**************************************************************************
* ISVBgCm_fnHandleMenuMsg()
*/
static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg(
IContextMenu2 *iface,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
BgCmImpl *This = (BgCmImpl *)iface;
FIXME("(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam);
return E_NOTIMPL;
}
/**************************************************************************
* IContextMenu2 VTable
*
*/
static const IContextMenu2Vtbl cmvt =
{
ISVBgCm_fnQueryInterface,
ISVBgCm_fnAddRef,
ISVBgCm_fnRelease,
ISVBgCm_fnQueryContextMenu,
ISVBgCm_fnInvokeCommand,
ISVBgCm_fnGetCommandString,
ISVBgCm_fnHandleMenuMsg
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -