CreatePopupMenu

C# Signature:

[DllImport("user32.dll")]
static extern IntPtr CreatePopupMenu();

Sample Code:

[Guid("6B3A1F0C-C382-40d6-AA13-33B0AB46EEAA")]
    public class BatchResultContextMenu: IShellExtInit, IContextMenu
    {
        #region Protected Members
        protected const string guid = "{6B3A1F0C-C382-40d6-AA13-33B0AB46EEAA}";
        protected string m_fileName;
        protected uint m_hDrop = 0;
        #endregion

        #region IContextMenu
        // IContextMenu
        int    IContextMenu.QueryContextMenu(uint hMenu, uint iMenu, int idCmdFirst, int idCmdLast, uint uFlags)
        {
            // Create the popup to insert
            uint hmnuPopup = Helpers.CreatePopupMenu();

            int id = 1;
            if ( (uFlags & 0xf) == 0 || (uFlags & (uint)CMF.CMF_EXPLORE) != 0)
            {
                uint nselected = Helpers.DragQueryFile(m_hDrop, 0xffffffff, null, 0);
                if (nselected == 1)
                {
                    StringBuilder sb = new StringBuilder(1024);
                    Helpers.DragQueryFile(m_hDrop, 0, sb, sb.Capacity + 1);
                    m_fileName = sb.ToString();

                    // Populate the popup menu with file-specific items
                    id = PopulateMenu(hmnuPopup, idCmdFirst+ id);
                }

                // Add the popup to the context menu
                MENUITEMINFO mii = new MENUITEMINFO();
                mii.cbSize = 48;
                mii.fMask = (uint) MIIM.TYPE | (uint)MIIM.STATE | (uint) MIIM.SUBMENU;
                mii.hSubMenu = (int) hmnuPopup;
                mii.fType = (uint) MF.STRING;
                mii.dwTypeData = "Actions";
                mii.fState = (uint) MF.ENABLED;
                Helpers.InsertMenuItem(hMenu, (uint)iMenu, 1, ref mii);

                // Add a separator
                MENUITEMINFO sep = new MENUITEMINFO();
                sep.cbSize = 48;
                sep.fMask = (uint )MIIM.TYPE;
                sep.fType = (uint) MF.SEPARATOR;
                Helpers.InsertMenuItem(hMenu, iMenu+1, 1, ref sep);

            }
            return id;
        }

        void AddMenuItem(uint hMenu, string text, int id, uint position)
        {
            MENUITEMINFO mii = new MENUITEMINFO();
            mii.cbSize = 48;
            mii.fMask = (uint)MIIM.ID | (uint)MIIM.TYPE | (uint)MIIM.STATE;
            mii.wID    = id;
            mii.fType = (uint)MF.STRING;
            mii.dwTypeData    = text;
            mii.fState = (uint)MF.ENABLED;
            Helpers.InsertMenuItem(hMenu, position, 1, ref mii);
        }

        int PopulateMenu(uint hMenu, int id)
        {
            // Grab some info about the file
            bool done = ProcessBatchResults(); 

            if (done)
            {
                AddMenuItem(hMenu, "Reschedule", id, 0);
                AddMenuItem(hMenu, "Retry Now", ++id, 1);
                AddMenuItem(hMenu, "Cancel", ++id, 2);
            }
            else
            {
                // Uses 100-baed values to distinguish on the "done" status
                AddMenuItem(hMenu, "Commit", 100 + id, 0);
                AddMenuItem(hMenu, "Rollback", 100 + (++id), 1);
            }

            return id++;
        }

        bool ProcessBatchResults()
        {
            FileInfo fi = new FileInfo(m_fileName);
            return (fi.Length >0);
        }

Sample Code:

Sample Code:

Sample Code:

Sample Code:

Sample Code:

Última actualización