I have made a shell extension dll in c# to add a menuitem to the explorer context menu
I have implemented these method
IShellExtInit.Initializ
IContextMenu.QueryContextMen
IContextMenu.GetCommandStrin
IContextMenu.InvokeComman
When I register the dll with regasm and gacutil a menuitem shows in the explorer contextmenu and
IShellExtInit.Initialize and IContextMenu.QueryContextMenu gets called. But GetCommandString and
InvokeCommand never gets called when I click the menu item
Can anyone explain whats going on
Thank
Lars 4 7838
a dll file consisting of the two files shellext.cs and ContextMenuHandler.c
shellext.c
using System
using System.Runtime.InteropServices
namespace ShellEx
// IUnknow
[ComImport(), GuidAttribute("00000000-0000-0000-c000-000000000046")
InterfaceType(ComInterfaceType.InterfaceIsIUnknown )
public interface IUnknow
// IClassFactor
[ComImport(), GuidAttribute("00000001-0000-0000-c000-000000000046")
InterfaceType(ComInterfaceType.InterfaceIsIUnknown )
public interface IClassFactor
// IShellExtIni
[ComImport(), GuidAttribute("000214e8-0000-0000-c000-000000000046")
InterfaceType(ComInterfaceType.InterfaceIsIUnknown )
public interface IShellExtIni
[PreserveSig()
int Initialize (IntPtr pidlFolder, IntPtr lpdobj, uint /*HKEY*/ hKeyProgID)
// IContextMen
[ComImport(), GuidAttribute("000214e4-0000-0000-c000-000000000046")
InterfaceType(ComInterfaceType.InterfaceIsIUnknown )
public interface IContextMen
// IContextMenu method
[PreserveSig()
int QueryContextMenu(uint hmenu, uint iMenu, int idCmdFirst, int idCmdLast, uint uFlags)
[PreserveSig()
void InvokeCommand (IntPtr pici)
[PreserveSig()
void GetCommandString(int idcmd, uint uflags, int reserved, string commandstring, int cch)
ContextMenuHandler.c
using System
using System.Runtime.InteropServices
using Microsoft.Win32
using ShellExt
namespace ContextMenuHandle
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-4F33EC089772"), ComVisible(true)
public class MyExtension : IShellExtInit, IContextMen
// *** Imports ************************************************** **
// MessageBo
[DllImport("user32")
static extern int MessageBox(int hWnd, string text, string caption, int type)
[DllImport("user32")
static extern bool InsertMenu( uint hMenu
uint uPosition
uint uFlags
int uIDNewItem
string lpNewIte
)
// *** Consts ************************************************** ***
const string guid = @"{xxxxxxxx-xxxx-xxxx-xxxx-4F33EC089772}"
const string regHome1 = @"my_file\shellex\ContextMenuHandlers"
const string regApproved = @"Software\Microsoft\Windows\CurrentVersion\She ll Extensions\Approved"
const int I_OK = 0
const int I_FALSE = 1
// *** Functions **************************************************
// Initializ
int IShellExtInit.Initialize (IntPtr /*LPCITEMIDLIST*/ pidlFolder, IntPtr /*LPDATAOBJECT*/ lpdobj, uint /*HKEY*/ hKeyProgID
MessageBox(0, "IShellExtInit.Initialize", "Information", 0)
return I_OK
// QueryContextMen
int IContextMenu.QueryContextMenu(uint hMenu, uint iMenu, int idCmdFirst, int idCmdLast, uint uFlags
MessageBox(0, "IContextMenu.QueryContextMenu", "Information", 0)
// MessageBox(0, hMenu.ToString()+" "+ iMenu.ToString()+" "+ idCmdFirst.ToString()+" "+ idCmdLast.ToString()+" "+ uFlags.ToString(), "Information", 0)
bool bResult = InsertMenu(hMenu, 0, 0, 1024, "Do &Stuff...")
// MessageBox(0, "Result = "+bResult.ToString(), "Information", 0)
return 1
// GetCommandStrin
void IContextMenu.GetCommandString(int idCmd, uint uFlags, int pwReserved, string commandString, int cchMax
MessageBox(0, "IContextMenu.GetCommandString", "Information", 0)
return
// InvokeComman
void IContextMenu.InvokeCommand(IntPtr pici
MessageBox(0, "IContextMenu.InvokeCommand", "Information", 0)
return
// *** COM Register/Unregister functions **************************
[ComRegisterFunction
public static void Register(System.Type t)
tr
RegistryKey regRoot = Registry.ClassesRoot
RegistryKey regKey
regRoot.CreateSubKey(regHome1)
regKey = regRoot.CreateSubKey(regHome1 + @"\MyCommandISE")
regKey.SetValue(string.Empty, guid)
// Add to list of approved shellextension
regRoot = Registry.LocalMachine
regKey = regRoot.OpenSubKey(regApproved, true)
regKey.SetValue(guid, "ContextMenu Extension")
// CloseKey
regKey.Close()
regRoot.Close();
}
catch(Exception ex)
{
MessageBox(0, ex.Message, "Exception Occured", 0);
}
}
[ComUnregisterFunction]
public static void UnRegister(System.Type t)
{
try
{
RegistryKey regRoot = Registry.ClassesRoot;
RegistryKey regKey;
regRoot.DeleteSubKeyTree(@"my_file\shellex");
// Remove from list of approved shellextensions
regRoot = Registry.LocalMachine;
regKey = regRoot.OpenSubKey(regApproved, true);
regKey.DeleteValue(guid);
regKey.Close();
regRoot.Close();
}
catch(Exception ex)
{
MessageBox(0, ex.Message, "Exception Occured", 0);
}
}
} // ContextMenuExtension
} // Namespace
Lars, bool bResult = InsertMenu(hMenu, 0, 0, 1024, "Do &Stuff...");
Where did you get 1024 from? I believe you're supposed to use
idCmdFirst there rather than picking your own arbitrary command ID.
void IContextMenu.GetCommandString(int idCmd, uint uFlags, int pwReserved, string commandString, int cchMax)
I'd make commandString an IntPtr or possibly a StringBuilder.
Mattias
--
Mattias Sjögren [MVP] mattias @ mvps.org http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
Please reply only to the newsgroup.
found the problem! ;
int IContextMenu.QueryContextMenu(uint hMenu, uint iMenu, int idCmdFirst, int idCmdLast, uint uFlags
int idCmd = idCmdFirst
bool bResult = InsertMenu(hMenu, iMenu++, 1024, idCmd++, "Do &Stuff...")
return 1
1024 is the value of MF_BYPOSITIO This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: miles__ahead |
last post by:
Hi. I like to create little utilities for Windows. It's nice to have
Shell Integration, such as using the Context Menu. I've googled
but haven't seen any Python example code for IContextMenu...
|
by: Lars Nielsen |
last post by:
I have made a shell extension dll in c# to add a menuitem to the explorer context menu
I have implemented these method
IShellExtInit.Initializ
IContextMenu.QueryContextMen...
|
by: shafeeque |
last post by:
I am building a shell extn. project in .net ide which is
converted from vC++ 6.00.
During buid i am getting the following error
"error C2787: 'IContextMenu' : no GUID has been associated
with...
|
by: Rajko |
last post by:
HRESULT QueryContextMenu(
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags
);
function gives me to small range of numbers !!!
usually:
|
by: yxq |
last post by:
Hello
I have some code about shell extension, it works well, but when i choose
more than a txt files and right-click, click open, system popup a dialog
"InvokeCommand", system can not open the txt...
|
by: gilad |
last post by:
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...
|
by: lushdog |
last post by:
Hi, i'm writing a shell extension in c# that will add two menu's to the
right-click menu of explorer if any file is selected, i.e. it's
registered in the * section of Classes in the registry.
...
|
by: lushdog |
last post by:
Hi, i'm having a little problem with my context menu handler.
Basically if i select multiple files and right-click OPEN or EDIT, it
uses my context menu to open it. It is because i am missing this...
|
by: Poggs |
last post by:
Hi everyone,
I used the pattern for Shell Extensions for Context menu from Dino
Esposito's article. However I implemented it in more than one application
and it seems that those two right click...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
| |