WM_KEYDOWN 在 WndProc 中 - 不触发
WM_KEYDOWN in WndProc - doesn't trigger
我正在尝试捕获 WM_KEYDOWN
以在表单级别处理一些键盘事件。我知道我可以使用 KeyPreview=true
并使用 TForm
的 OnKeyDown
事件。但是,我想在 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。
我正在尝试捕获 WM_KEYDOWN
以在表单级别处理一些键盘事件。我知道我可以使用 KeyPreview=true
并使用 TForm
的 OnKeyDown
事件。但是,我想在 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。