【发布时间】:2013-02-11 17:26:26
【问题描述】:
首先,一些链接(对于那些想自己尝试的人):我正在将Proteus VX VST plugin 加载到我的主机OpenMPT。该插件工作得很好,但它似乎窃取了一些窗口消息,因此单击主机创建的菜单,甚至单击关闭按钮都没有效果。单击关闭按钮甚至不会触发其“按下按钮”动画,因此 Windows 可能不会收到任何有关窗口操作的消息。我知道像 Renoise 这样的其他 VST 主机没有这个问题(点击窗口的关闭按钮在那里工作得很好),所以必须有办法避免这种情况。
我怀疑 Proteus VX 安装了一个不符合要求的窗口 proc,它可能忘记调用 MFC 自己的窗口 proc(也可能不调用 DefWindowProc),但我不知道如何找到它,更不用说如何修理它。我尝试在打开插件窗口之前保存原始 GWL_WNDPROC,然后在显示编辑器后立即恢复此 proc,但这没有帮助。
编辑:插件肯定做一些狡猾的事情;在允许它对我的窗口做任何事情之前,我使用存储原始 WindowProc
windowProc = GetWindowLongPtr(m_hWnd, GWL_WNDPROC);
并在插件完成其窗口初始化业务后使用恢复它
SetWindowLongPtr(m_hWnd, GWL_WNDPROC, windowProc);
这让我可以使用我自己的菜单和窗口的 [x] 按钮,直到我在插件 GUI 中摆弄一下;我想插件一旦接收到输入焦点,就会再次覆盖窗口进程。
【问题讨论】:
-
这篇文章真的必须是一个大段吗?
-
您说“Windows 可能没有收到任何有关窗口操作的消息。”我发现非常不太可能:Windows 是一开始就发送这些消息的。有问题的插件很可能会“吃掉”消息,但您的分析似乎有点不对劲。
-
这很可能是真的——我不确定如何最好地描述这个问题。我只是希望有人会根据描述知道可能的原因。