我想处理wm_char消息为什么不行?keypreview已经设为true,请知道的高手看看! (15分)

  • 主题发起人 主题发起人 daoxindeng
  • 开始时间 开始时间
D

daoxindeng

Unregistered / Unconfirmed
GUEST, unregistred user!
主要代码如下:(部分略) <br><br>procedure WMChar(var Msg:TMessage);message WM_CHAR;//定义消息<br><br>procedure TForm1.WMChar(var Msg:TMessage);//处理消息<br>begin<br>&nbsp; showmessage('keydown');<br>&nbsp; inherited;<br>end;
 
如果Form的KeyPreview属性为False,则不会处理WM_CHAR消息,它会将这个消息转给当前焦点的控件(ActiveControl)来处理,如TEdit、TMemo等,但大部分控件并不能处理WM_CHAR消息。如果KeyPreview属性为True,则可以响应该消息。
 
因为Form没有获得焦点。<br><br>控件只要能获得焦点就能得到WM_CHAR消息,而Form的KeyPreview比较特殊,Form上所有的可响应WM_CHAR消息的控件都会在处理WM_CHAR消息前先判断所在Form的KeyPreview属性,如果为True,则把WM_CHAR消息处理交由Form的WM_CHAR消息处理过程处理,不进行自己的WM_CHAR消息处理。
 
事实上只要Form上有焦点控件,Form是无法获得焦点的,只能通过KeyPreview属性。
 
把KeyPreview属性设置为true后,可以响应onkeypress事件(也就是封装的wm_char的事件),但是如果直接写wm_char事件(我上面测试用的例子),得不到任何响应。
 
在form上不行,用application.onmessage就行了。你加个applicationevents试试。
 
为什么不行,看看wincontrol的代码就知道了:<br>&nbsp; if (Form &lt;&gt; nil) and (Form &lt;&gt; Self) and Form.KeyPreview and<br>&nbsp; &nbsp; TWinControl(Form).DoKeyDown(Message) then Exit;<br>它直接跳到twincontrol得消息处理函数去了,根本就不会执行你的处理函数。<br>
 
谢谢各位。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
588
import
I
I
回复
0
查看
602
import
I
后退
顶部