CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

重载消息处理WndProc()后的奇怪情况。。

楼主superaf(阿斐)2002-04-17 09:56:11 在 C++ Builder / 基础类 提问

在unit2.h中:  
  #   define   KEYLEFT   WM_USER+1  
  。。。。。。。。。。。。。。  
  private:  
          BEGIN_MESSAGE_MAP  
          VCL_MESSAGE_HANDLER(KEYLEFT,TMessage,OnLeft)  
          END_MESSAGE_MAP(TForm)  
   
          virtual     void   __fastcall   WndProc(TMessage   &Message);  
          void   __fastcall   OnLeft(TMessage   &Message);  
   
  在unit2.cpp中:  
     
  void   __fastcall   TForm2::WndProc(Messages::TMessage   &Message)  
  {  
            if(Message.WParam==37)  
              {  
                        ShowMessage(Message.WParam);  
                        SendMessage(Form2->Handle,KEYLEFT,0,0);  
              }  
         
          TForm::WndProc(Message);  
           
  }  
  。。。。。。。。。。。。。。。。  
  void   __fastcall   TForm2::OnLeft(TMessage   &Message)  
  {  
        ShowMessage("The   Left_kKey   is   Pressed");    
  }  
   
  但在程序运行中,每次都触发了两次ShowMessage(Message.WParam);,应当不可能有这种情况的吧   ??  
  请那位高手指导一下,在下都差不多给急死了!!! 问题点数:50、回复次数:12Top

1 楼xiaolun(小懒)回复于 2002-04-17 10:17:23 得分 30

判断语句改为:  
   
            if(Message.WParam==37   &&   Message.Msg   ==   48384)  
  Top

2 楼superaf(阿斐)回复于 2002-04-17 10:21:40 得分 0

Message.Msg   ==   48384   ??     我先去试试,这个改了有什么用处,我不清楚Top

3 楼superaf(阿斐)回复于 2002-04-17 10:23:20 得分 0

成功了,不过可以指明下,这个消息号是作什么用的阿?我没有查到   :)  
  看见了就散分。Top

4 楼xiaolun(小懒)回复于 2002-04-17 10:23:51 得分 0

原因是每次按Left键时,Windows会产生好几个相关消息,他么的WParam都是  
  37(代表Left键),但Msg不一样,有KeyDown,KeyUp,等等,反正在BCB6,Window  
  2000下我试了一下,会产生五个消息,Msg分别为48384,45102,45086,  
  45061,256。至于他们具体是什么意思,查一下MSDN或看看VC的头文件就知道  
  了.Top

5 楼40Star(斯文、大方、有前途)回复于 2002-04-17 10:27:36 得分 0

if(Message.WParam==37   &&   Message.Msg   ==   WM_KEYDOWN)Top

6 楼40Star(斯文、大方、有前途)回复于 2002-04-17 10:29:25 得分 10

WM_SYSKEYDOWN  
  WM_SYSKEYUP    
  WM_SYSCHAR  
  WM_KEYDOWN  
  WM_CHAR  
  WM_KEYUPTop

7 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2002-04-17 10:30:02 得分 10

可能  
  一次是键按下,另一次是键弹起Top

8 楼ice_blue(冰蓝)回复于 2002-04-17 10:39:05 得分 0

建议你仔细了解一下Windows的消息循环机制,关于消息的结构,你可以看看MSDN关于   "MSG"   和C++   Builder关于   "TMessage"的解释。  
  Top

9 楼superaf(阿斐)回复于 2002-04-17 10:45:49 得分 0

To     xiaolun(小懒)   :但我现在需要截获窗体的按键的消息很多,大约有20多个吧,比如还有其他的方向键,keylright,keyup,keydown,还有数字键,每个也都要这么去找吗?  
  To   40Star:     你的方法我试了下,好像没有用,请查看下:  
      if(Message.WParam==37   &&   Message.Msg   ==   WM_KEYDOWN)  
   
  请大家继续帮忙帮忙,多谢!  
   
   
  Top

10 楼xiaolun(小懒)回复于 2002-04-17 18:47:04 得分 0

明天吧.Top

11 楼ygoss(LxyzL)回复于 2002-04-17 23:49:36 得分 0

以前也碰到过,但不知咋回事。呵呵,这回知道了。多谢   xiaolun(小懒)   、     superaf   (阿斐)     !!!多谢其它几位!!Top

12 楼xiaolun(小懒)回复于 2002-04-18 16:38:32 得分 0

试一下  
   
        if(Message.WParam==37   &&   Message.Msg   ==   CN_KEYDOWN)  
   
  应该没问题,CN_xxx是BCB自己定义的消息,用于VCL的控件消息通知的。  
  CN   =   Control   Notify  
  Top

相关问题

  • 如何重载 WndProc
  • 重载WndProc的问题
  • Dll中的函数重载处理
  • 如何重载TAB 处理事件!
  • 如何重载按钮的WndProc?
  • 想不通! 奇怪的重载函数名!(附源程序)
  • 重载operator new,当size==0时的处理
  • 重载()
  • 重载!
  • 请问如果重载处理Windows窗口右上角那个叉叉的函数。

关键词

  • 消息
  • tmessage
  • keyleft
  • wndproc
  • onleft
  • wparam
  • keydown
  • 多谢
  • message
  • fastcall

得分解答快速导航

  • 帖主:superaf
  • xiaolun
  • 40Star
  • BCB

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo