Появляются сообщения о том, что окна WinAPI украдены плагином - как это исправить?
Прежде всего, несколько ссылок (для тех, кто хочет попробовать сами): я загружаю плагин Proteus VX VST на свой хост OpenMPT. Плагин работает просто отлично, однако кажется, что он крадет некоторые оконные сообщения, так что нажатие на меню, созданное хостом, или даже нажатие кнопки закрытия не имеет никакого эффекта. Нажатие на кнопку закрытия даже не запускает анимацию "нажатие кнопки", поэтому Windows, вероятно, не получает никаких сообщений относительно действий окна. Я знаю, что другие хосты VST, такие как Renoise, не имеют этой проблемы (нажатие кнопки закрытия окна прекрасно работает там), поэтому должен быть способ избежать этого.
Я подозреваю, что Proteus VX устанавливает несоответствующий оконный процесс, который, вероятно, забывает вызывать собственный оконный процесс MFC (и, возможно, также не вызывает DefWindowProc), но я понятия не имею, как это выяснить, не говоря уже о том, как это исправить. Я попытался сохранить исходный файл GWL_WNDPROC перед тем, как открыть окно плагина, а затем восстановить этот процесс сразу после отображения редактора, но это не помогает.
Редактировать: плагин должен обязательно сделать что-то хитрое; прежде чем позволить ему что-то делать с моим окном, я сохраняю оригинальный WindowProc, используя
windowProc = GetWindowLongPtr(m_hWnd, GWL_WNDPROC);
и восстановить его после того, как плагин завершил свой бизнес инициализации окна, используя
SetWindowLongPtr(m_hWnd, GWL_WNDPROC, windowProc);
Это позволяет мне использовать мои собственные меню и кнопку окна [x], пока я немного не покопаюсь в плагине GUI; Я предполагаю, что плагин перезаписывает процесс окна снова, как только он получает фокус ввода.
1 ответ
На тот случай, если кто-нибудь наткнется на это, решением было не разместить графический интерфейс VST прямо в моем собственном окне. Вместо этого я помещаю статическую метку в это окно и затем говорю VST использовать эту метку в качестве родителя.