【问题标题】:Extend an external application's menu扩展外部应用程序的菜单
【发布时间】:2010-07-03 17:47:24
【问题描述】:

我目前正在为第三方应用程序编写插件。
由于插件框架不提供访问 UI 的任何方式,我现在尝试通过 WinAPI 手动执行此操作。

更具体地说,我想在“文件”菜单中为我的插件添加一个自定义菜单项。

我第一次尝试使用 FindWindow 检索主窗口的句柄并且使用 GetMenu 没有成功,因为 GetMenu 只是返回 NULL .

我的下一步是使用 EnumChildWindows 并搜索具有文本“&File”的孩子(我真的不喜欢这种方法,因为它使本地化变得非常糟糕)。但是,我只找到了菜单项的句柄,但是我需要相应的 HMENU 才能使用 AppendMenu,不是吗?
简单的转换不起作用,并导致“无效的菜单句柄”。

真的有可能实现我想要的吗?怎么样?

提前感谢您的想法!

【问题讨论】:

    标签: c++ windows winapi menu


    【解决方案1】:

    它很可能不是 HMENU。自定义菜单实现很常见,Window 提供的一个已经过时且不灵活。例如,与 Windows 窗体的 MenuStrip 进行比较。

    当然,这会在你的方法中留下一个大洞。

    【讨论】:

    • 但是 Winsharp 只需要它在这个特定的应用程序上工作(他的插件是为这个应用程序编写的)所以如果他能让这个方法工作为什么不呢?
    • 嗯——我明白了。如果它是自定义菜单 - 您对如何实现它有任何想法吗(它看起来像操作系统主题菜单)?也许我可以挂钩菜单弹出窗口本身的创建......
    • 挂钩弹出窗口可能有助于获得句柄,但您仍然无法添加项目。这些不会是 MENUINFO。任何事情都尽可能地实现,研究依赖关系并查看 EXE 内部以尝试发现可能已使用的类库。
    • 也许这不是必需的:我连接到应用程序窗口的 WndProc 并等待 WM_MENUSELECT,它的 lParam 包含正在打开的菜单的句柄。我使用 AppendMenu 传递该句柄,最后我的菜单项是可见的(不在我想要的菜单中,但我希望能设法将它放在我想要的位置)。现在我会尝试是否可以解决问题并尝试对用户单击我的菜单项做出反应。
    • 还有一个大问题:WM_MENUSELECT 仅在用户移过第一个菜单条目时发送 - 第一次打开菜单时,我的条目将不可见。对于“文件”菜单,WM_INITMENU 似乎没有被触发。 WM_INITMENU 可能是解决方案,但我没有收到此消息。任何想法为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2012-03-17
    • 2011-03-26
    • 1970-01-01
    • 2012-01-27
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多