unit CustomControldel;interfaceuses
  SysUtils, Classes, Controls,Dialogs, Windows;type
  TCustomControl1 = class(TCustomControl)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Paint; override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure CMWantSpecialKey(var Message: TCMWantSpecialKey); message CM_WANTSPECIALKEY;
  end;procedure Register;implementationprocedure Register;
begin
  RegisterComponents('Standard', [TCustomControl1]);
end;
constructor TCustomControl1.Create(AOwner: TComponent);
begin
  inherited;
  //
end;destructor TCustomControl1.Destroy;
begin
  //
  inherited;
end;procedure TCustomControl1.Paint;
begin
  inherited;
//
end;
procedure TCustomControl1.KeyDown(var Key: Word; Shift: TShiftState);
begin
   ShowMessage('yes');
end;procedure TCustomControl1.CMWantSpecialKey(var Message: TCMWantSpecialKey);
begin
  inherited;
  if Message.CharCode in [vk_Left..vk_Down] then Message.Result := 1;
end;end.

解决方案 »

  1.   

    http://dev.csdn.net/article/23/23213.shtm
      

  2.   

    form 的keypreview为False的话在控件中按键不触发窗体的keydown事件
      

  3.   

    to: jinjazz(近身剪(N-P攻略)) ( ) 已经看过了。自身技术太差,不能理解。
    to:dyf2001(西风) ( ) 已经设置了。KeyPreView为true了。不行。是不是我的组件中就没有KeyDown事件的缘故。在测试一下。
      

  4.   

    增加了KeyDown事件也不成功。可以在属性框中看到keydown事件。写了一句代码。同时设置窗体的KeyPreview属性为真,2个keydown的语句都不执行。
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    type
      TmyButton=class(TButton)
        private
          procedure CMWantSpecialKey(var Message: TCMWantSpecialKey); message CM_WANTSPECIALKEY;
      end;
    var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TmyButton.CMWantSpecialKey(var Message: TCMWantSpecialKey); begin
    inherited;
    // 我们只想处理向左方向键,其它的特殊键都给 Windows 处理
    if Message.CharCode = VK_LEFT then
      showmessage('left');
    end;procedure TForm1.FormCreate(Sender: TObject);
    var myBtn: TmyButton;
    begin
      myBtn:=TmyButton.Create(self);
      myBtn.Parent:=self;
      myBtn.Caption:='按左键'
    end;end.
      

  6.   

    获不获得焦点不应该由组件自己决定,是由系统决定的继承自TWinControl得组件都可以用SetFocus方法获得焦点