我在过滤窗口键盘输入时遇到一个问题:
我打开KeyPreView后,在KeyPress里面做处理,不需要的字符只要Key:=#0就可以了,但是在Keydown这个事件里面做类似的操作就不行,有谁知道其中的原有吗?Key都是Var的,小弟就不懂了,等待中

解决方案 »

  1.   

    Keydown这个事件里的Key值都是键盘输入的ASCII值肯定不行了。
      

  2.   

    keypress事件中的key是char型的,而keydown事件中的key是word型的,有区分的,如
    keypress中:key:=#13 在keydown事件中:key:=VK_Return
      

  3.   

    KeyPress主要用来接收字母、数字等ANSI字符,而 KeyDown 事件过程可以处理任何不被 KeyPress 识别的击键,诸如:功能键(F1-F12)、编辑键、定位键以及任何这些键和键盘换档键的组合等。与 KeyDown 事件不同的是,KeyPress 不显示键盘的物理状态(SHIFT键),而只是传递一个字符。KeyPress 将每个字符的大、小写形式作为不同的键代码解释,即作为两种不同的字符。
      

  4.   

    几种key事件里,key类型并不一样,
    你再看看个时间里参数中key的类型,
    像keypress里和keydown就不一样的。
      

  5.   

    但是,我做了以下的测试:在KeyDown设断点,按个'w'什么的,记住这个Key的值,然后再按个'q'什么的,在处理过程中给那个Key赋先前记住的那个值,但是出来的结果仍旧是'w',也就是说这个赋值语句就是没起作用,why?
      

  6.   

    没有人能回答我的问题吗?我就想实现类似在KeyPress事件里面过滤按键的功能,类似 key:=#0 。
      

  7.   

    KeyPress主要用来接收字母、数字等ANSI字符,而 KeyDown 事件过程可以处理任何不被 KeyPress 识别的击键  ...........kSHAPEG已经说清楚了哦。
      

  8.   

    KeyPress是由WMChar消息触发,先于KeyDown,KeyPress后Edit.Text已经赋值了。
    KeyDown由WMKeyDown触发,你在KeyDown中改的值也只在该过程有效。你可以试试,在KeyDown中改值,到KeyUp中值又变成触发KeyUp消息的那个按键了。过滤按键还是在KeyPress里写吧。
      

  9.   

    ssq237712(流亡帅哥) :
    当一个键按下,事件触发的顺序应该是:KeyDown->KeyPress->KeyUp
    如果按下的是Ctrl、Alt、Shift之类的控制键,则KeyPress不会被触发。
      

  10.   

    DDGG(叮叮当当),你可以试一下到底是先KeyDown还是KeyPress,不要想当然。
    当然,功能键不能触发KeyPress的。
      

  11.   

    To ssq237712:
    我再重申一次:KeyDown当然是产生在KeyPress之前的。
    不信你自己做个试验,在Form1上放置一个TEdit,然后这样处理事件:procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      Form1.Color := clRed;
    end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      Form1.Color := clBlue;
    end;看看在Edit1里按过键之后窗体的颜色是红的还是蓝的吧!
    是红的你对,是蓝的我对。
      

  12.   

    控制键不算,因为那将不触发Edit1KeyPress。
      

  13.   

    呵呵,是我错了。
    不过有意思的是:
    procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      ShowMessage('D');
    end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      ShowMessage('P');
    end;将发现先显示P,再显示D,其实明明断点先到keydown。
      

  14.   

    To: ssq237712(流亡帅哥) 
    呵呵,是的,我已经猜到你是这样测试的了。
    因为Delphi的事件是可以重入的,其实显示P和显示D的对话框都弹出了,只不过后弹出的把前面的覆盖了而已。
    就像下面这个例子,前一个ShowMessage窗口并不能阻止后面的ShowMessage窗口弹出。
    procedure TForm1.Timer1Timer(Sender: TObject);
    const
    {$J+}
      i: Integer = 0;
    {$J-}
    begin
      Inc(i);
      ShowMessage('Hello ' + IntToStr(i));
    end;
      

  15.   

    类型不相同啊.
    在keyPress中的赋值方式是 Key:=#0
    在KeyDown中的赋值方式是 Key :=0;
    还有一种解决方法就是在窗体创建时,通过系统一定的方法通知系统自动将所有的按键都触发KeyPress事件,我看到过这种方法,但不记得代码是怎么写的了,它是通过发一个windows的消息来实现的.