469,326 Members | 1,544 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,326 developers. It's quick & easy.

GetMenuItemInfo MENUITEMINFO question

I'm trying to get the text of a menu item in a context/popupmenu in an
external application. I have a simple mouse hook catching the right
click, and then the left click on the context menu that was opened by
the application, however the GetMenuItemInfo() method is returning an
error code 87, incorrect parameter msg. I know I am probably not
initializing my struct correctly, but I can't find any documentation on
it. Below is some sample code:

// GetMenuItemInfo
[DllImport("user32.dll")]
static extern bool GetMenuItemInfo(IntPtr hMenu, uint uItem, bool
fByPosition,ref MENUITEMINFO lpmii);

[StructLayout(LayoutKind.Sequential)]
internal struct MENUITEMINFO
{
public int cbSize;
public int fMask;
public int fType;
public int fState;
public int wID;
public IntPtr hSubMenu;
public IntPtr hbmpChecked;
public IntPtr hbmpUnchecked;
public string dwTypeData;
public IntPtr dwItemData;
public int cch;
public IntPtr hbmpItem;

}

// MenuItem Contstants
public const int MIIM_FTYPE = 0x100;
public const int MIIM_STRING = 0x40;

MENUITEMINFO mif = new MENUITEMINFO();
mif.cbSize = Marshal.SizeOf(typeof(MENUITEMINFO));
mif.fMask = MIIM_STRING;
mif.cch = 256;

// e.hookStruct.hwnd is the handle of the context menu that was opened.
// GetMenuItemInfo always returns false
bool retrieved = GetMenuItemInfo(e.hookStruct.hwnd,4,true,ref mif);

Console.WriteLine("Menu Item Retrieved = {0}",retrieved);
if ( !retrieved )
Console.WriteLine("Error recieved:
{0}",Marshal.GetLastWin32Error());

Nov 17 '05 #1
7 7519
>MENUITEMINFO mif = new MENUITEMINFO();
mif.cbSize = Marshal.SizeOf(typeof(MENUITEMINFO));
mif.fMask = MIIM_STRING;
mif.cch = 256;
You also have to initialize dwTypeData to a buffer big enough to hold
256 characters.

// e.hookStruct.hwnd is the handle of the context menu that was opened.
// GetMenuItemInfo always returns false
bool retrieved = GetMenuItemInfo(e.hookStruct.hwnd,4,true,ref mif);


An HWND isn't the same as an HMENU, which is what the first argument
should be.
Mattias

--
Mattias Sjögren [MVP] mattias @ mvps.org
http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
Please reply only to the newsgroup.
Nov 17 '05 #2
I initialized the dwTypeData property with a char[256], and set the cch
= 256, but still no luck. If the click event being raised from my hook
is not giving me the HMENU, where am I supposed to get this value?

Nov 17 '05 #3
>If the click event being raised from my hook
is not giving me the HMENU, where am I supposed to get this value?


What kind of hook is it you have in place and which click event is it
you're handing?
Mattias

--
Mattias Sjögren [MVP] mattias @ mvps.org
http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
Please reply only to the newsgroup.
Nov 17 '05 #4
This is a hook example from an article Dino Esposito wrote. <a
href="http://msdn.microsoft.com/msdnmag/issues/02/10/CuttingEdge/">Cutting
Edge article</a>

It tries to get the MenuItem on the LeftButtonDown event raised by the
hook.

Nov 17 '05 #5
I am however, not getting back an error this time, the GetMenuItemInfo
method is returning false instead of true though, but atleast I'm not
getting the error 87 again.

Nov 17 '05 #6
>This is a hook example from an article Dino Esposito wrote. <a
href="http://msdn.microsoft.com/msdnmag/issues/02/10/CuttingEdge/">Cutting
Edge article</a>

It tries to get the MenuItem on the LeftButtonDown event raised by the
hook.


I looked at the code for that article, but I don't see any
LeftButtonDown event anywhere.

Anyway, I don't know of any way to get a HMENU from the menu's HWND.
Mattias

--
Mattias Sjögren [MVP] mattias @ mvps.org
http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
Please reply only to the newsgroup.
Nov 17 '05 #7
I am however, not getting back an error this time, the GetMenuItemInfo
method is returning false instead of true though, but atleast I'm not
getting the error 87 again.
Did you ever succeed in making this work?
I'm having the same problem and finding no luck.

I am using an hMenu and check it successfully with IsMenu(hMenu).
GetMenuItemCount(hMenu) returns the correct number of menu items.
However, if I try using:
GetMenuItemID(hMenu, i) i being the position it always returns -1.
GetMenuItemInfo(hMenu, i, true, ref mif); alyways returns false.

I can't get any information on the menu items.
My app. is in C# and my OS is Windows 2000.

Help would be greatly appreciated.
Apr 26 '06 #8

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Mohammed Mazid | last post: by
3 posts views Thread by Stevey | last post: by
53 posts views Thread by Jeff | last post: by
56 posts views Thread by spibou | last post: by
2 posts views Thread by Allan Ebdrup | last post: by
3 posts views Thread by Zhang Weiwu | last post: by
reply views Thread by suresh191 | last post: by
reply views Thread by harlem98 | last post: by
reply views Thread by listenups61195 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.