2013-02-11 55 views
2

首先,一些链接(对于那些想自己尝试的人):我正在将Proteus VX VST plugin加载到我的主机OpenMPT中。该插件工作正常,但它似乎窃取一些窗口消息,以便点击由主机创建的菜单,甚至点击关闭按钮都不起作用。单击关闭按钮甚至不会触发其“按钮”动画,因此Windows可能不会收到有关窗口操作的任何消息。我知道像Renoise这样的其他VST主机没有这个问题(单击窗口的关闭按钮在那里工作得很好),所以必须有一种方法来避免这种情况。WinAPI窗口消息似乎被插件窃取 - 如何解决?

我怀疑Proteus VX安装了一个不合格的窗口过程,可能忘记调用MFC自己的窗口过程(也可能不会调用DefWindowProc),但我不知道如何找到它,更不用说如何要解决这个问题。我试图在打开插件窗口之前保存原始的GWL_WNDPROC,然后在显示编辑器后立即恢复此过程,但这没有帮助。

编辑:该插件必须肯定做些蠢事;允许它与我的窗口做任何事情之前,我存储使用

windowProc = GetWindowLongPtr(m_hWnd, GWL_WNDPROC); 

,并恢复它原来的WindowProc插件做了使用

SetWindowLongPtr(m_hWnd, GWL_WNDPROC, windowProc); 

这让我用我自己的菜单的窗口初始化业务后,和窗口的[x]按钮,直到我在插件GUI中摆弄一下;我猜想这个插件只要接收到输入焦点,就会重写窗口过程再次

+0

这篇文章是否真的必须是__大段落? – 2013-02-11 17:47:07

+0

你说“* Windows可能不会收到任何有关窗口操作的消息*。”我发现**非常不可能:Windows是将这些消息发送给谁的。这个插件可能会“消化”这些信息,但您的分析似乎有点不合适。 – 2013-02-11 18:59:42

+0

这很可能是真的 - 我不知道如何最好地描述问题。我只是希望有人可能会根据描述知道可能的原因。 – 2013-02-11 19:10:22

回答

1

为了防止任何人遇到此问题,解决方案是不要将VST GUI放置在我自己的窗口中。相反,我在该窗口中放置了一个静态标签,然后告诉VST将此标签用作父项。