Quantcast
Channel: Windows Forms General forum
Viewing all articles
Browse latest Browse all 12583

Shell Extension Context Menu in C# strange error.

$
0
0

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


Viewing all articles
Browse latest Browse all 12583

Trending Articles