type
  TForm1 = class(TForm)
  ……
  protected
    procedure WndProc(var Message: TMessage);override;
  ……procedure TForm1.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_KEYDOWN then
    showMessage('key pressed')
  else
    inherited;
end;在showMessage处设置断点,发现截取不到WM_KEYDOWN消息,但是把WM_KEYDOWN换为WM_MOUSEMOVE却可以执行showMessage,这是什么原因呢?
谢谢!

解决方案 »

  1.   

    你界面上肯定放有其它可视化控件吧,比如edit,button.
    焦点在edit上,WM_KEYDOWN是edit的,不是form
      

  2.   

    同样楼上的,应该是消息被FORM上面的控件截掉了
      

  3.   

    确实是这个原因,删掉form上的控件就可以了,但是我现在要让一个Edit控件对键盘输入做出响应,比如用户在文本框中输入“1”时显示“#”,而不再出现“1”,感觉只能用截取WM_KEYDOWN消息重写的方法,这样一来就不能删掉Edit控件了,不知道用什么方法可以实现这个功能?
    谢谢!
      

  4.   

    TO: charlze(我想我是海) ,如果仅为了将显示换为“#”,也就是PASSWORD输入方式,建议你继承EDIT,这样可靠安全。
      

  5.   

    Edit 有个OnKeyPress的事件,你在这个事件中写代码截取吧!
      

  6.   

    PASSWORD输入方式要求所有输入的字符统一显示为另一个字符,这一点不满足要求,例如输入“1”时显示“#”,输入2时显示“%”;
    对于OnKeyPress事件,不论你在这个函数中写什么,编译器都会在执行完你的代码后再在文本框中显示“1”,这种方法麻烦的地方就在于如何才能不让编译器将“1”显示出来