Hi, I seem to be having a problem getting a context menu to work in
Explorer. The menu item installs fine, but when I click it a message box
should pop up indicating the command was received and handled.
Unfortunately, nothing occurs.
I suspect that I am doing something wrong with the command ID for the
menu item, but I can't figure out what. After registering my DLL, the
menu item "my context menu" appears if I right-click any file. If I
highlight the menu item with my mouse, the information on Explorer's
status bar reads "Encrypt the selected files". My "GetCommandString()"
implementation is as follows (nothing about encryption, as you can see):
void IContextMenu.GetCommandString(int idCmd, uint uFlags, int
pwReserved, StringBuilder commandString, int cchMax)
{
switch(uFlags)
{
case (uint)GCS.VERB:
commandString = new StringBuilder("...");
break;
case (uint)GCS.HELPTEXT:
commandString = new StringBuilder("...");
break;
}
}
This is obviously suspect. Then, if I click on the item, no message box
appears. I've included the relevant parts of my code below.
This is where I setup the menu, and return an incremented command ID:
int IContextMenu.QueryContextMenu(uint hMenu, uint iMenu, int
idCmdFirst, int idCmdLast, uint uFlags)
{
int id = 0;
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();
}
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 = "my context menu";
mii.fState = (uint)MF.ENABLED;
Helpers.InsertMenuItem(hMenu, (uint)iMenu++, 1, ref mii);
}
return idCmdFirst+id+1;
}
Here is my "InvokeCommand()" implementation, which should show a simple
message box.
void IContextMenu.InvokeCommand (IntPtr pici)
{
try
{
Type typINVOKECOMMANDINFO = Type.GetType("TagSet.INVOKECOMMANDINFO");
INVOKECOMMANDINFO ici =
(INVOKECOMMANDINFO)Marshal.PtrToStructure(pici, typINVOKECOMMANDINFO);
MessageBox.Show("InvokeCommand");
}
catch(Exception)
{
}
}
Any help would be appreciated. Thanks, JA