【问题标题】:WM_KEYDOWN in WndProc - doesn't triggerWndProc 中的 WM_KEYDOWN - 不触发
【发布时间】:2021-12-26 02:20:09
【问题描述】:

我正在尝试捕获WM_KEYDOWN 以在表单级别处理一些键盘事件。我知道我可以使用KeyPreview=true 并使用TFormOnKeyDown 事件。但是,我想在WndProc() 中执行此操作,以简化单个函数中的事件处理。问题是,它不会在WndProc() 中触发。有没有特别的原因?除了用BEGIN_MESSAGE_MAP处理WM_KEYDOWN,还有别的办法吗?

void __fastcall TForm1::WndProc(TMessage &fMessage)
{
    switch (fMessage.Msg)
    {
        default:            break;

        case WM_KEYDOWN:    {
            TWMKeyDown KDMsg = reinterpret_cast<TWMKeyDown&>(fMessage);
            TShiftState KDSs = KeyDataToShiftState(KDMsg.KeyData); 

            if (KDMsg.CharCode == 'C' && KDSs.operator ==(TShiftState() << ssCtrl))
            {
                // Process CTRL+C key
                fMessage.Result = 1;
                return;
            }
        }
        break;
    }

    TForm::WndProc(fMessage);
}

【问题讨论】:

  • 附带说明,KDSs.operator ==(TShiftState() &lt;&lt; ssCtrl) 应该写成KDSs == (TShiftState() &lt;&lt; ssCtrl)

标签: c++builder keydown wndproc


【解决方案1】:

键盘(和鼠标)消息发布到具有输入焦点的窗口。如果TForm 具有具有焦点的子控件,则消息将直接发送到子控件的WndProc,而不是表单的WndProc

这就是KeyPreview 发挥作用的地方。如果为 true,它会告诉子控件将其键盘消息转发给其父 TForm 进行处理。

否则,您也可以使用TApplication(Events)::OnMessage 事件来处理输入消息,然后再将它们分派到目标窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2019-04-01
    • 2021-01-03
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多