非模式窗体中的可编辑控件无法响应LEFT、RIGHT、UP、DOWN、HOME、END、CTRL+V等按键的解决办法!
非模式窗体由于没有自己的消息循环,造成无法响应以上按键事件,后来使用向非模式窗体添加TApplicationEvent控件解决问题。
procedure TDlgFindFile.aplctnvntsMessage(var Msg: tagMSG;
var Handled: Boolean);
const
DialogKeys: set of Byte = [VK_ESCAPE,VK_END,VK_HOME,VK_LEFT, VK_RIGHT, VK_UP,VK_DOWN];//定义要截取的按键
var
CtrlPress:Boolean;
begin
if IsChild(Handle, Msg.hwnd) and (Msg.message = WM_KEYDOWN)then
//判断是否是自己窗口产生的事件和是否为键盘事件
begin
CtrlPress:=False;
IF GetKeyState(VK_CONTROL)<0 then//判断CTRL键状态
CtrlPress:=True;
if (Msg.wParam=$56) and CtrlPress then//判断是否为CTRL+V键组合按键
begin
//if (ActiveControl is TComboBox) or (ActiveControl is TEdit) or (ActiveControl is TMemo) then
begin
SendMessage(ActiveControl.Handle,WM_PASTE,0,0);//直接向活动控件发粘贴消息,这里不能使用发送键盘事件的方法
Handled := True;
end;
end else if Msg.wParam in DialogKeys then
begin
if Msg.wParam= VK_ESCAPE then//判断是否为 VK_ESCAPE 键按下,如果是,则关闭(隐藏)窗口
begin
Close;
end else
//if (ActiveControl is TComboBox) or (ActiveControl is TEdit) or (ActiveControl is TMemo) then
begin
SendMessage(ActiveControl.Handle,WM_KEYDOWN,Msg.wParam,Msg.lParam);
//直接将Message复制发送到活动控件,至于是否处理按键由活动控件自己去处理
Handled := True;
end;
end;
END;
end;