第三方插件,用于更改Win32中的主机菜单

时间:2016-06-24 16:23:03

标签: windows winapi dll mfc

我正在为桌面Windows应用程序开发第三方插件。它基本上是一个传统的DLL,只能由宿主应用程序访问。主机基于API提供插件的菜单项,但我想通过根据打开的文件动态修改菜单项的文本来扩展API。主机使用MDI窗口,我认为它是使用MFC开发的。但是,我试图直接使用Win API更改菜单项。 (这可能是问题,这是我的问题的一部分。)

第一次更改菜单项时,代码可以正常工作。但后续更改不会出现在菜单上。奇怪的是,GetMenuString似乎总是返回我设置它的值。这意味着在API级别它似乎工作,但菜单项不会更改(第一次除外)。

这是我用来更改菜单项文本的代码。这很基础。

MENUITEMINFOW menuInfo;
memset ( &menuInfo, 0, sizeof(menuInfo) );
menuInfo.cbSize = sizeof(menuInfo);
menuInfo.fMask = MIIM_STRING;
menuInfo.fType = MFT_STRING;
menuInfo.dwTypeData = (LPWSTR)newItemText;
SetMenuItemInfoW (hMenu, idToChange, false, &menuInfo);

MFC会干扰这个吗?或者也许是主机应用程序菜单处理的特质?或者我需要做些什么来让菜单正确显示?

1 个答案:

答案 0 :(得分:0)

我使用DeleteMenu和InsertMenu而不是SetMenuItemInfo来实现这一点。代码是直截了当的,但这是为了防止像我这样的其他人。

const UINT idToChange = GetMenuItemID ( hMenu, index );
DeleteMenu ( hMenu, index, MF_BYPOSITION );
InsertMenuW ( hMenu, index, MF_BYPOSITION | MF_STRING, idToChange, (LPWSTR)newItemText );