Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么赢了';你没找到工作吗?_C#_Wpf_Winapi_Pinvoke - Fatal编程技术网

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;