【发布时间】:2010-12-29 07:21:32
【问题描述】:
我使用此代码从 C# 中遍历本机 Windows 资源管理器菜单。
这是 GetMenuItemInfo 函数的导入:
[DllImport("user32.dll",SetLastError = true)]
public static extern bool GetMenuItemInfo(IntPtr hMenu, int uItem,
bool fByPosition, ref MENUITEMINFO lpmii);
我用这段代码遍历菜单:
int count = User32.GetMenuItemCount(menu);
var itemInfo = new MENUITEMINFO();
itemInfo.cbSize = Marshal.SizeOf(itemInfo);
itemInfo.fMask = MIIM.MIIM_ID | MIIM.MIIM_STRING;
bool previousDeleted = false;
for (int n = 0; n < count; n++)
{
itemInfo.dwTypeData = new string(' ', 100);
itemInfo.cch = 100;
if(!User32.GetMenuItemInfo(menu, n, true, ref itemInfo))
{
Debug.Print("Error={0}",Marshal.GetLastWin32Error());
}
...
当我从 x86 应用程序调用此代码时 - 它运行良好, 但是当我从“Any CPU”应用程序调用此代码时,它不起作用,并返回错误代码 87 (ERROR_INVALID_PARAMETER)。
有什么想法吗?
谢谢。
【问题讨论】:
-
GetMenuItemCount 调用成功了吗?您应该检查计数以查看它是否为 -1。
-
另外,您在第二行创建的 MENUITEMINFO 类型是什么?那是你自己的类型还是框架提供的?我假设它是你自己的,因为它没有命名空间前缀,但也许你有一个我们看不到的“使用”语句?
标签: c# winapi api 64-bit native