我在出窗口上有一个TEdit控件和一个TButton控件在Form.Create时,我设置了KeyPreview:= True;
然后在KeyDown事件中过滤按键
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_F2: ;//按下F2
    VK_F3{, VK_ADD小键盘+}: ;//按下F3,和小键盘的"+"号键    $30..$39{ VK_0,VK_1,VK_3 - VK_9 },
    $41..$5A{ VK_A - VK_Z },
    VK_NUMPAD0..VK_NUMPAD9,
    VK_HOME, VK_END,
    VK_BACK, VK_DELETE:
        begin
            if (Shift = [ssAlt]) and (Key = $32) then begin
                // 按下 ALT+2 时
                
            end else begin
                // 当焦点不在Edit上时,按下 A-Z,0-9,Home,End,Back,Delete键都会自动回到Edit,并且输入按下的Key
                if not Edit1.Focused then begin
                    Edit1.SetFocus;
                    // 这里暂时用了模拟键盘的方法
                    keybd_event(Key, 0, 0, 0);
                    keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
                end;
            end;
        end;
  end;
end;
问题1:
    当按下Alt+2时,会正确跳到处理Alt+2的地方,但如果当前焦点在Edit的时候,在Edit中同样会输入"2"这个字符。有没有方法不让Edit输入这个字符呢?问题2:
    在焦点不在Edit上时,按下A-Z,0-9等按键会自动将焦点返回到Edit,但如果不写keybd_event这2行模拟键盘敲击事件的代码,在Edit中就不会输入按下的字符。
    我只查到通过SendMessage(hwnd, WM_SETTEXT, 0, Longint(str));的方法。但这个方法是设置整个Edit.Text,并不是往后加一个字符。
    能不能通过发送消息或其他方法实现模拟键盘敲击的功能,当然并不是光增加字符,因为还有Home,End,Back和Delete键。