procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;我想拦截按键消息,但按四个方向键时怎么没有反应呢??

解决方案 »

  1.   

    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 来处理。
      

  2.   

    谢谢楼上!我用
    procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN; 也可以实现,
    但对WM……、CM……和CN……比较模糊,这三种有什么说法吗??
      

  3.   

    看了procedure TWinControl.CNKeyDown(var Message: TWMKeyDown);
    的实现,好象明白了一点点……~~~~
    晕~~~~希望高手给辟讲辟讲!!