我的程序只有一个主窗口和一个TEdit控件,
1.在程序中:定义了处理WM_KEYDOWN消息的消息处理函数Test(),Form1->KeyPreview = true;
但在Edit1中输入字符时,Test()并未响应,而我去掉TEdit控件只下主窗口时,程序可以响应
WM_KEYDOWN消息,调用Test()进行处理
2.我重截WndProc()代码如下
{
  if(Message.Msg == WM_KEYDOWN)
    ShowMessage("ok"); //代码1
  TForm::Dispatch(&Message);
}
Form1->KeyPreview = true;
在Edit1中还是不能响应WM_KEYDOWN消息(代码1不执行),而我去掉TEdit控件只下主窗口时,代码1可执行不知该如何截获TEdit控件的消息,望高手指点

解决方案 »

  1.   

    这样写:
    procedure tedit.wndproc(var message:tmessage);
    begin
      if(message.msg=wm_keydown)then
      showmessage('ok');
      dispatch(message);
    end;
      

  2.   

    你怎么写也响应不了,因为WM_KEYDOWN这个消息本身就是发送给主窗体的,根本就不会发送到Edit的消息队列中!去MSDN查查Edit的消息是什么?!!!
      

  3.   

    WM_KEYDOWN这个消息不会发送到Edit的WndProc中!!!!
      

  4.   


    procedure tform.vmessages(var message:tagmsg; var handled:boolean);
    begin
    if message.hwnd=edit1.handle then  
    if(message.msg=wm_keydown)then
    begin
      {处理函数}
    end;
    end;在FORM的FORMCREATE中加入
    application.onmessage=vmessages;
      

  5.   

    本来还有很多不清楚的地方要继续请教,但近来任务较多只好作罢,所以先结贴了。
    以后再专门贴个讨论贴,望各位赏光。现还有一个直接的问题需要解决,还请各位看看
    在C++Builder论坛,题目是“CBC事件研究(2)——如何向TEdit控件发送Windwos事件”