0

アクティブなアプリケーションでメニュー項目のラベル名を読み取り、List<String>.

残念ながら、dwTypeDataALWAYS を返します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;
4

3 に答える 3

1

a)ループはfor (int i = Win32.GetMenuItemCount(hMenu) - 1; i >= 0; i--)

b) を最初に呼び出す前に、NULL (ゼロ)GetMenuItemInfo()に設定する必要があります。mif.dwTypeData

c) の 2 番目の呼び出しの前に、GetMenuItemInfo()mif.dwTypeDataサイズで割り当てられたバッファを指す必要がありますmif.cch + 1-- MSDN のドキュメントを参照してください

後でメモリの割り当てを解除してください。

于 2013-06-10T06:12:49.857 に答える
0

交換してみる

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

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

Win32 API MENUITEMINFOAのドキュメントには、次のように記載されています。

MFT_STRINGはMIIM_STRINGに置き換えられました。

于 2020-10-17T12:57:14.730 に答える