按下上、下键时,msg.message=????

解决方案 »

  1.   

    http://dev.csdn.net/article/23/23213.shtmzt下面一部分第十五部分 窗口讯息15.1 为什么我的组件得不到方向键的讯息? 
    你必须拦截 WM_GETDLGCODE 才能处理方向键的讯息,在 WM_GETDLGCODE 的讯息处理 者中传回 DLGC_WANTARROWS。如果你不这样做,那方向键的功用就只能用来移动窗口焦点而己。
    Max Nilson 的回答:
    想要你的组件能够处理方向键,你必须要拦截 CM_WANTSPECIALKEY 组件讯息。 CM_WANTSPECIALKEY 组件讯息提供你比拦截 WM_GETDLGCODE 窗口讯息更容易且灵活的判断方法来决定是否需要某些特殊键的讯息。当控件收到任何一个特殊键时就会送出CM_WANTSPECIALKEY 组件讯息给控件。
    特殊键包括:VK_TAB、VK_LEFT、VK_RIGHT、VK_UP、VK_DOWN、VK_RETURN、VK_EXECUTE 、VK_ESCAPE 及 VK_CANCEL。如果讯息传回值是非零值,这个键就会被送至 KeyPress 方法以供处理,否则这个键的讯息会被送至组件的父控件,以预设方式来处理。
    一个简单的范例:type
    TMyComponent = class (TWinControl)
    ... 
    protected 
    procedure CMWantSpecialKey(var Message: TCMWantSpecialKey); message CM_WANTSPECIALKEY;
    ...
    end;procedure TMyComponent.CMWantSpecialKey(var Message: TCMWantSpecialKey); begin
    inherited;
    // 我们只想处理向左方向键,其它的特殊键都给 Windows 处理
    if Message.CharCode = VK_LEFT then
    Message.Result := 1; 
    end;
    CM_WANTSPECIALKEY 组件讯息比 WM_GETDLGCODE 讯息更具有弹性的地方在这儿。我们甚至可以根据是按下的是哪个特殊键才决定是否处理这个键。例如,你的控件有三张影像,你可以让使用者利用左右方向键来回检视它们,如果翻到最后一张影像再按向右键时,焦点就让它离开组件,剩下的全部都让 Delphi 来处理。