C# 为什么赢了';你没找到工作吗?
我正在尝试读取活动应用程序中菜单项的标签名称,并将它们存储在C# 为什么赢了';你没找到工作吗?,c#,wpf,winapi,pinvoke,C#,Wpf,Winapi,Pinvoke,我正在尝试读取活动应用程序中菜单项的标签名称,并将它们存储在列表中 不幸的是,dwTypeData总是返回null。为什么会这样 List<string> ls = new List<string>(); IntPtr hMenu = Win32.GetMenu(hWnd); if (hMenu.ToInt32() != 0) { for (int
列表中
不幸的是,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;
List ls=new List();
IntPtr humenu=Win32.GetMenu(hWnd);
如果(humenu.ToInt32()!=0)
{
对于(int i=Win32.GetMenuItemCount(hMenu);i>=0;i--)
{
尝试
{
uint MIM_字符串=0x00000040;
uint MFT_字符串=0x00000000;
uint MIIM_类型=0x00000010;
Win32.MENUITEMINFO mif=新的Win32.MENUITEMINFO();
mif.cbSize=(uint)Marshal.SizeOf(typeof(Win32.MENUITEMINFO));
mif.fMask=MIIM_类型;
mif.fType=MFT_字符串;
mif.cch=256;
mif.dwTypeData=“”;
Win32.GetMenuItemInfo(humenu,(uint)i,true,ref mif);//将cch加载到内存中
Win32.GetMenuItemInfo(humenu,(uint)i,true,ref mif);//填充dwTypeData
ls.Add(mif.dwTypeData);
}
捕获{}
}
}
返回ls;
a)循环应该是for(int i=Win32.GetMenuItemCount(humenu)-1;i>=0;i--)
b) 在第一次调用GetMenuItemInfo()
之前,需要将mif.dwTypeData
设置为NULL(零)
c) 在第二次调用GetMenuItemInfo()
之前,mif.dwTypeData
应该指向分配了大小为mif.cch+1
的缓冲区--
请确保以后释放内存 您的问题是您试图在不同的过程中执行此操作。调用GetMenuItemInfo
时,传递MENUITEMINFO
结构的地址。但该地址仅在您的流程中有效。因为每个进程都有自己的私有虚拟内存空间,所以您发送的指针在另一个进程中没有意义
您可以使用VirtualAllocEx
、WriteProcessMemory
和ReadProcessMemory
在另一个进程的地址空间中分配、写入和读取MENUITEMINFO
结构的实例。这是让这个机制发挥作用的唯一希望。使用websearch可以找到很多例子来说明这项技术
但是,我不建议你这样做。您应该使用一个标准的自动化接口来解决实际问题。例如UIAutomation。尝试替换
mif.fMask = MIIM_TYPE;
mif.fType = MFT_STRING;
与
文件指出:
MFT_字符串替换为MIIM_字符串
你有什么可以推荐的吗?这段代码和您的评论让我印象深刻的是,我的程序可以成功地检测菜单中有多少项,以及显示或删除菜单,那么为什么它不能从标签中读取文本值呢?我很困惑。。。对不起,我的无知。你还在这里寻找答案吗?
mif.fMask = MIIM_FTYPE;
mif.fType = MIIM_STRING;