重载消息处理WndProc()后的奇怪情况。。
在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




