InsertMenuItem将字符串切断为第一个char

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了InsertMenuItem将字符串切断为第一个char相关的知识,希望对你有一定的参考价值。

我试图使用InsertMenuItem修改窗口的系统菜单(而不是InsertMenu - 原因是我想最终插入子菜单)。语言是C#。

尝试插入一个新项目,尝试获取现有项目并重新插入它,它插入,但项目字符串仅在菜单中显示为第一个字符。任何人都知道我错过了什么?

        // try creating one from scratch
        MENUITEMINFO it = new MENUITEMINFO();
        it.cbSize = (uint)Marshal.SizeOf(it);
        it.fMask = 64;// MIIM_STRING
        it.wID = 12345;
        it.dwTypeData = "Now is the time";
        it.fType = 0;
        it.cch = 0;
        InsertMenuItem(hSysMenu, 7, true, ref it);

        //try copying one
        GetMenuItemInfo(hSysMenu, (uint)0, true, ref it);
        it.cch += 10;
        it.dwTypeData = new string(' ', (int)(menuItemInfo.cch+10));
        GetMenuItemInfo(hSysMenu, (uint)0, true, ref it);
        it.wID = 123456;
        var err = InsertMenuItem(hSysMenu, 1, true, ref it);

上面的代码enter image description here的结果

答案

好吧,我终于明白了。我会把它留在这里,所以当他们对此感到困惑时,也许其他人会发现它。

原因是InsertMenuItem p / invoke是用。定义的

pinvoke.net网站中的[DllImport(“user32.dll”)] - 请参阅https://www.pinvoke.net/default.aspx/user32/insertmenu.html?diff=y

它需要

[DllImport(“user32.dll”,CharSet = CharSet.Auto)]

我更改了pinvoke.net页面以反映它。

以上是关于InsertMenuItem将字符串切断为第一个char的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中获取等效的正则表达式以切断前导和尾随子字符串

不确定为啥 toupper() 会切断 C 中的最后一个字母

编写有字符型参数c和整型参数N的函数,让它显示出由字符c组成的三角形。其方式为第1行有一个字符c,第2行有2个字符c等等-简单

将字符串拆分为第一个单词和其余文本?

如何在 20 个字符后切断文本视图?

JSON字符串被切断[重复]