IContextMenu

C# Signature:

[ComImport(), 
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown), 
    GuidAttribute("000214e4-0000-0000-c000-000000000046")]
    public interface IContextMenu
    {
        [PreserveSig()]
        int QueryContextMenu(
            uint hMenu, 
            uint indexMenu, 
            int idCmdFirst, 
            int idCmdLast, 
            uint uFlags);

        [PreserveSig()]
        void InvokeCommand(IntPtr pici);

        [PreserveSig()]
        void GetCommandString(
            int idcmd, 
            uint uflags, 
            int reserved, 
            StringBuilder commandstring, 
            int cch);
    }

VB Signature:

<ComImport()> _
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
<GuidAttribute("000214e4-0000-0000-c000-000000000046")> _
Public Interface IContextMenu
     <PreserveSig()> _
     Function QueryContextMenu( _
     ByVal hMenu As Integer, _
     ByVal indexMenu As Integer, _
     ByVal idCmdFirst As Integer, _
     ByVal idCmdLast As Integer, _
     ByVal uFlags As Integer) As Integer

     <PreserveSig()> _
     Sub InvokeCommand(ByVal pici As IntPtr)

     <PreserveSig()> _
     Sub GetCommandString( _
     ByVal idcmd As Integer, _
     ByVal uflags As Integer, _
     ByVal reserved As Integer, _
     ByVal commandstring As StringBuilder, _
     ByVal cch As Integer)
End Interface

Sample Code:

string commandStr = "" ;
    if ((uFlags & (uint)GCS.VERB) != 0) 
    {
        //obviously you could insert some cases here
        switch (idCmd)
        {
            default:
                commandStr = "..."; 
                break;
        }
    }
    if((uFlags  & (uint)GCS.HELPTEXT) != 0)
    {
        switch (idCmd)
        {
            case 0:
                commandStr = "Menu Item 1. And a brief description of what it does.";
                break;
            case 1:
                commandStr = "Menu Item 2. And a brief description of what it does." ;
                break;
            case 2:
                commandStr = "Menu Item 3. And a brief description of what it does.";
                break;
            case 3:
                commandStr = "Menu Item 4. And a brief description of what it does."; 
                break;
            default:
                commandStr = "..."; 
                break;
        }
    }

    // must limit the return string to cchMax
    if (commandStr.Length >= cchMax) commandStr = commandStr.Substring(0, cchMax-1) ;

    // now return unicode or ansi based on uFlags
    if((uFlags  & (uint)GCS.UNICODE) != 0 ) 
    {
        str = Marshal.StringToHGlobalUni(commandStr);
        Helpers.lstrcpynW(commandString, str, cchMax);
        Marshal.FreeHGlobal(str);
    }
    else 
    {
        str = Marshal.StringToHGlobalAnsi(commandStr);
        Helpers.lstrcpynA(commandString, str, cchMax);
        Marshal.FreeHGlobal(str);
    }

Última actualización