unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
  private
    { Private declarations }
  protected
  public
    procedure WndProc(var Message : TMessage); override;
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.WndProc(var Message : TMessage);
begin
  if (Message.Msg = WM_KEYFIRST) then
  begin
    showmessage('WM_KEYFIRST');
  end;
  if (Message.Msg = WM_KEYDOWN) then
  begin
    showmessage('WM_KEYDOWN');
  end;
  if (Message.Msg = WM_KEYUP) then
  begin
    showmessage('WM_KEYUP');
  end;
  if (Message.Msg = WM_CHAR) then
  begin
    showmessage('WM_CHAR');
  end;
  if (Message.Msg = WM_DEADCHAR) then
  begin
    showmessage('WM_DEADCHAR');
  end;
  if (Message.Msg = WM_SYSKEYDOWN) then
  begin
    showmessage('WM_SYSKEYDOWN');
  end;
  if (Message.Msg = WM_SYSKEYUP) then
  begin
    showmessage('WM_SYSKEYUP');
  end;
  if (Message.Msg = WM_SYSCHAR) then
  begin
    showmessage('WM_SYSCHAR');
  end;
  if (Message.Msg = WM_SYSDEADCHAR) then
  begin
    showmessage('WM_SYSDEADCHAR');
  end;
  if (Message.Msg = WM_KEYLAST) then
  begin
    showmessage('WM_KEYLAST');
  end;
  inherited WndProc(Message);
end;end.
连一个按键都捕捉不到。

解决方案 »

  1.   

    程序启动时的焦点在edit1上的
      

  2.   

    procedure WndProc(var Message : TMessage); override;
    这是消息处理过程的声明吗?
    既没有保留字Message表示消息句柄,而且还用Override
      

  3.   

    procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var msg:Tmessage;
    begin
        msg.Msg:=WM_KEYDOWN;
        msg.WParam:=0;
        msg.LParam:=0;
        WndProc(msg);
    end;
    增加上面过程
      

  4.   

    加入了
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      self.KeyPreview:=true;
    end;
    还是没有作用
      

  5.   

    拉个TApplicationEvent
    写在OnMessage里
    procedure TMainForm.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
      if (Msg.message = WM_KEYFIRST) then
      begin
        showMessage('WM_KEYFIRST');
      end;
      if (Msg.message  = WM_KEYDOWN) then
      begin
        showmessage('WM_KEYDOWN');
      end;
      if (Msg.message = WM_KEYUP) then
      begin
        showmessage('WM_KEYUP');
      end;
      if (Msg.message = WM_CHAR) then
      begin
        showmessage('WM_CHAR');
      end;
      if (Msg.message = WM_DEADCHAR) then
      begin
        showmessage('WM_DEADCHAR');
      end;
      if (Msg.message = WM_SYSKEYDOWN) then
      begin
        showmessage('WM_SYSKEYDOWN');
      end;
      if (Msg.message = WM_SYSKEYUP) then
      begin
        showmessage('WM_SYSKEYUP');
      end;
      if (Msg.message = WM_SYSCHAR) then
      begin
        showmessage('WM_SYSCHAR');
      end;
      if (Msg.message = WM_SYSDEADCHAR) then
      begin
        showmessage('WM_SYSDEADCHAR');
      end;
      if (Msg.message = WM_KEYLAST) then
      begin
        showmessage('WM_KEYLAST');
      end
    end;