繁体   English   中英

为什么 GetMenuItemInfo 不起作用?

[英]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结构的地址。 但该地址仅在您的进程中有效。 因为每个进程都有自己的私有虚拟内存空间,所以你发送的那个指针在其他进程中没有意义。

您可能可以使用VirtualAllocExWriteProcessMemoryReadProcessMemory在另一个进程的地址空间中分配、写入和读取MENUITEMINFO结构的实例。 这是您使该机制发挥作用的唯一希望。 使用网络搜索可以找到很多说明该技术的示例。

但是,我不建议您这样做。 您应该使用标准自动化接口之一来解决您的实际问题。 例如 UIAutomation。

尝试更换

mif.fMask = MIIM_TYPE;
mif.fType = MFT_STRING;

mif.fMask = MIIM_FTYPE;
mif.fType = MIIM_STRING;

Win32 API MENUITEMINFOA文档指出

MFT_STRINGMIIM_STRING取代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM