WM_KEYDOWN 在 WndProc 中 - 不触发

WM_KEYDOWN in WndProc - doesn't trigger

我正在尝试捕获 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);
}

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

这就是 KeyPreview 发挥作用的地方。当为真时,它告诉子控件将它们的键盘消息转发给它们的父控件 TForm 进行处理。

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