[英]Why won't GetMenuItemInfo work?
我正在尝试读取活动应用程序中菜单项的标签名称并将它们存储在List<String>
。
不幸的是, dwTypeData
总是返回null
。 为什么是这样?
List<string> ls = new List<string>();
IntPtr hMenu = Win32.GetMenu(hWnd);
if (hMenu.ToInt32() != 0)
{
for (int i = Win32.GetMenuItemCount(hMenu); i >= 0; i--)
{
try
{
uint MIIM_STRING = 0x00000040;
uint MFT_STRING = 0x00000000;
uint MIIM_TYPE = 0x00000010;
Win32.MENUITEMINFO mif = new Win32.MENUITEMINFO();
mif.cbSize = (uint)Marshal.SizeOf(typeof(Win32.MENUITEMINFO));
mif.fMask = MIIM_TYPE;
mif.fType = MFT_STRING;
mif.cch = 256;
mif.dwTypeData = "";
Win32.GetMenuItemInfo(hMenu, (uint)i, true, ref mif); //To load cch into memory
Win32.GetMenuItemInfo(hMenu, (uint)i, true, ref mif); //To fill dwTypeData
ls.Add(mif.dwTypeData);
}
catch { }
}
}
return ls;
a) 循环应该是for (int i = Win32.GetMenuItemCount(hMenu) - 1; i >= 0; i--)
b) 在第一次调用GetMenuItemInfo()
,您需要将mif.dwTypeData
设置为 NULL(零)
c) 在第二次调用GetMenuItemInfo()
, mif.dwTypeData
应该指向一个分配大小为mif.cch + 1
的缓冲区—— 参见 MSDN 文档
确保之后释放内存!
您的问题是您正试图在不同的进程中执行此操作。 当您调用GetMenuItemInfo
您将传递MENUITEMINFO
结构的地址。 但该地址仅在您的进程中有效。 因为每个进程都有自己的私有虚拟内存空间,所以你发送的那个指针在其他进程中没有意义。
您可能可以使用VirtualAllocEx
、 WriteProcessMemory
和ReadProcessMemory
在另一个进程的地址空间中分配、写入和读取MENUITEMINFO
结构的实例。 这是您使该机制发挥作用的唯一希望。 使用网络搜索可以找到很多说明该技术的示例。
但是,我不建议您这样做。 您应该使用标准自动化接口之一来解决您的实际问题。 例如 UIAutomation。
尝试更换
mif.fMask = MIIM_TYPE;
mif.fType = MFT_STRING;
和
mif.fMask = MIIM_FTYPE;
mif.fType = MIIM_STRING;
MFT_STRING被MIIM_STRING取代。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.