请问大虾:KEYDOWN消息怎么捕捉不到四个方向按键呢??

newfang 2005-12-01 09:22:33
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;

我想拦截按键消息,但按四个方向键时怎么没有反应呢??
...全文
271 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
newfang 2005-12-03
  • 打赏
  • 举报
回复
回楼上:标记,就是做上标记的意思!
baiduan 2005-12-02
  • 打赏
  • 举报
回复
mark 是什么意思?
newfang 2005-12-01
  • 打赏
  • 举报
回复
看了procedure TWinControl.CNKeyDown(var Message: TWMKeyDown);
的实现,好象明白了一点点……~~~~
晕~~~~希望高手给辟讲辟讲!!
newfang 2005-12-01
  • 打赏
  • 举报
回复
谢谢楼上!我用
procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN; 也可以实现,
但对WM……、CM……和CN……比较模糊,这三种有什么说法吗??
g961681 2005-12-01
  • 打赏
  • 举报
回复
也学习一把~~~~~
beyondtkl 2005-12-01
  • 打赏
  • 举报
回复
向剪刀兄 学习。
jinjazz 2005-12-01
  • 打赏
  • 举报
回复
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 来处理。
阿三 2005-12-01
  • 打赏
  • 举报
回复
学习
xylegend 2005-12-01
  • 打赏
  • 举报
回复
mark
newfang 2005-12-01
  • 打赏
  • 举报
回复
顶!!

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧