Hi, i'm writing a shell extension in c# that will add two menu's to the right-click menu of explorer. Here is the problem. If i select one file and use the standard OPEN context menu all is well, but if i select two or more files and use the standard OPEN context menu it seems to want to run through the code for MY created menu. Here is the code in question:
int IContextMenu.QueryContextMenu(uint hmenu,uint iMenu, int idCmdFirst,int idCmdLast,uint uFlags)
{
// The first id to use (should be 1)
int id = 1;
if ((uFlags & 0xf) == 0 || (uFlags & (uint)CMF.CMF_EXPLORE) != 0)
{
// Create a new Menu Item to add to the context menu
MENUITEMINFO mii = new MENUITEMINFO();
mii.cbSize = 48;
mii.fMask = (uint)MIIM.ID | (uint)MIIM.TYPE | (uint)MIIM.STATE;
mii.wID = idCmdFirst + id;
mii.fType = (uint)MF.STRING;
mii.dwTypeData = "Send file(s) to CheapFTP member(s)";
mii.fState = (uint)MF.ENABLED;
// Add it to the item
DllImports.InsertMenuItem(hmenu, (uint)2, 1, ref mii);
id = 2;
// Create a new Menu Item to add to the context menu
MENUITEMINFO miii = new MENUITEMINFO();
miii.cbSize = 48;
miii.fMask = (uint)MIIM.ID | (uint)MIIM.TYPE | (uint)MIIM.STATE;
miii.wID = idCmdFirst + id;
miii.fType = (uint)MF.STRING;
miii.dwTypeData = "Quick Send file(s) to CheapFTP preferred member(s)";
miii.fState = (uint)MF.ENABLED;
// Add it to the item
DllImports.InsertMenuItem(hmenu, (uint)2, 1, ref miii);
id = 3;
// Create a seperator
MENUITEMINFO sep = new MENUITEMINFO();
sep.cbSize = 48;
sep.fMask = (uint)MIIM.TYPE;
sep.wID = idCmdFirst + id;
sep.fType = (uint)MF.SEPARATOR;
// Add it to the seperator to the context menu
DllImports.InsertMenuItem(hmenu, (uint)2, 1, ref sep);
}
// Return the number of items added
return id;
}
void IContextMenu.InvokeCommand(IntPtr pici)
{
try
{
//fileList
StringBuilder fileList = new StringBuilder();
StringBuilder sb = new StringBuilder(1024);
uint i = 0;
//Get number of files
uint uNumFiles = 0;
uNumFiles = DllImports.DragQueryFile(m_hDrop, 0xFFFFFFFF, null, 0);
//make file name
while (i < uNumFiles)
{
DllImports.DragQueryFile(m_hDrop, i, sb, sb.Capacity + 1);
fileList.Append(sb + ",");
i++;
}
// Determine which of the context menus was clicked
Type t = Type.GetType("ShellExt.INVOKECOMMANDINFO");
INVOKECOMMANDINFO ici;
ici = (INVOKECOMMANDINFO)Marshal.PtrToStructure(pici, t);
switch (ici.verb - 1)
{
case 0:
// Send File(s) to CheapFTP client
Process.Start("c:\\CheapFTP.exe", "\"" + fileList.ToString() + "\"");
break;
case 1:
// Send File(s) to CheapFTP client with QuickSend Flag enabled
fileList.Append("QuickSend,");
Process.Start("c:\\CheapFTP.exe", "\"" + fileList.ToString() + "\"");
break;
default:
MessageBox.Show("Shell Error");
break;
}
}
catch(Exception e)
{
System.Windows.Forms.MessageBox.Show("Error : " + e.ToString(),
"Error in CheapFTP installation. Please re-install.");
}
}
If i use my created menus everything works as planned, and so do all the other menus i have installed, i.e. WinRar and NOD32 Antivirus. If i select one file and use the standard OPEN menu it works correctly. Only when i select multiple files and select OPEN, i notice that it runs through the code for MY menu, i.e. the MessageBox "Shell Error" will pop up as often as the number of files i have selected. It is my understanding that if i select the OPEN menu it should not even run through my code at all. I have thought it may be a problem with assigning and returning the "id" in the QueryContextMenu function but at first glance it seems that all the other context menus are working properly. Any ideas/suggestions? TIA,lushdog