Borland的编译器对WM_KEYDOWN作了过滤?不能接受小写键值? ( 积分: 50 )

  • 主题发起人 主题发起人 江南草
  • 开始时间 开始时间

江南草

Unregistered / Unconfirmed
GUEST, unregistred user!
本是在学习SDK过程中看MSDN的,用微软的Compiler一切都好(废话)。<br>后来后来随意的一个Form1上处理OnKeyDown,发现惟有大写字母才有反应。<br><br>procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;<br> &nbsp;Shift: TShiftState);<br>begin<br> Form1.KeyPreview:=true;<br> if key=ord('s') then showmessage('****.');<br>end;
 
本是在学习SDK过程中看MSDN的,用微软的Compiler一切都好(废话)。<br>后来后来随意的一个Form1上处理OnKeyDown,发现惟有大写字母才有反应。<br><br>procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;<br> &nbsp;Shift: TShiftState);<br>begin<br> Form1.KeyPreview:=true;<br> if key=ord('s') then showmessage('****.');<br>end;
 
确实如此,以下是说明<br>Most of the virtual key codes are defined in the Windows unit. Additional key codes may be defined in special-purpose Windows wrappers such as the imm unit. For alphabetic keys, you should use ord with an uppercase character, for example, ord( 'M' ). To create a virtual key code for an alphanumeric value, use the Ord method. For example the virtual key code code for 7 is Ord('7').
 
改成 if char(key) in ['s', 'S'] then showmessage('****.');
 
如果你用SDK开发,keydown,keypress是不同的消息触发的,而且keydown返回的是Virtual-Key Codes,Virtual-Key Codes本来就是没有小写的,而keypress才可以返回char,可以区分大小写,你说微软的Compiler都好,哪要看你截获的是什么消息
 
这个问题一开始让我很迷惑,把msdn的例子用vc6编译,当然是成功的。于是就对照着cpp的源码写delphi,但在这个accelerator上就是没反应。所以就回到vcl上试了下,发现OnKeyDown不能接受lowercase。<br>不过,重启之后,却发现delphi sdk的程序又响应lowercase的输入了。想起来,大概是delphi2005太耗费内存,我在那上面看online help和语法,但实际调试用的却是edit plus和command line。估计是编译出来的程序留在缓存里没及时更新吧。<br><br>Platform SDK上讲WM_KEYDOWN说,<br>“The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed. ”<br>这是我试用alt(virtual key :vk_menu)的动机。<br><br>再,sdk里没有wm_keypress吧,那只是wm_char的封装。
 
不要乱说,KeyDown事件里的key是键盘的虚拟键值,而并非是ASCII码,ORD返回的是指定字符的ASCII码,当然不能等了,至于为什么只等于大写,是因为从a-z的VK码都等于对应的大写字母的ASCII码。
 
楼上的做没做过具体的SDK实现呢?呵呵。我可以把代码给你看,可以响应Lowercase的键入。
 
多人接受答案了。
 
后退
顶部