gpt4 book ai didi

c++ - SetFocus 到父窗口,然后回到子窗口

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:49 28 4
gpt4 key购买 nike

我正在尝试使用 VSTGUI 4.0 实现 VST。我的 DAW 使用 WM_KEYDOWN 和 WM_KEYUP 消息根据键盘按下发送 MIDI 音符,这样您就可以用键盘播放 VST。问题是,VSTGUI 在收到 WM_LBUTTONDOWN 消息时会执行此操作:

win32Frame->prevFocus = SetFocus (win32Frame->getPlatformWindow ());

CPoint where ((CCoord)((int)(short)LOWORD(lParam)), (CCoord)((int)(short)HIWORD(lParam)));
if (pFrame->platformOnMouseDown (where, buttons) == kMouseEventHandled)
SetCapture (win32Frame->getPlatformWindow ());
return 0;

这会窃取 DAW 的焦点,并且不允许它处理按键操作。 VSTGUI 需要窗口焦点才能处理 WM_MOUSEWHEEL 和 WM_KEYUP/WM_KEYDOWN 事件以调整控件。但是,当您在 VST 中调整控件时,您显然希望能够使用键盘弹奏音符以查看它们听起来像什么,因此这两种功能都很重要。

我能想到解决问题的唯一方法是将 SetFocus() 发送到父窗口,使用 SendMessage() 将 WM_KEYUP/WM_KEYDOWN 消息发送回父窗口,然后将 SetFocus() 发送回 VST 窗口:

case WM_KEYDOWN:
...code to handle modifiers like shift, ctrl, etc...
else
{
SetFocus(win32Frame->prevFocus);
SendMessage(win32Frame->prevFocus, message, wParam, lParam);
SetFocus(win32Frame->getPlatformWindow ());
}

这非常有效,直到您单击 VST 并同时按下一个键,此时会发生未定义的事情(卡住 DAW、崩溃 DAW、堆栈溢出等)。

很明显,我对此采取了错误的方法。我觉得我需要 PostMessage() 并等待回调,然后再将焦点返回到 VST 或类似的东西。虽然这听起来有点困惑,但处理此类问题的正确方法到底是什么?

请记住,我无权访问向下传递消息的 DAW 窗口的代码,因此我无法实现自定义消息或类似的东西。

最佳答案

非常感谢 Hans Passant 解决了这个问题!

崩溃问题是由于我的窗口句柄不可靠。我不再将窗口句柄存储在变量中,而是使用 GetParent() 当场获取它。

我也不需要将焦点设置到当前窗口,我需要做的就是用 PostMessage 替换我的 SendMessage。所以新代码:

case WM_KEYDOWN:
...code to handle modifiers like shift, ctrl, etc...
else
{
PostMessage(GetParent(win32Frame->getPlatformWindow ()), message, wParam, lParam);
}

关于c++ - SetFocus 到父窗口,然后回到子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17501192/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com