Dragon  
Dragon
日历
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 58
  • 文章 - 0
  • 评论 - 55
  • 引用 - 0

导航

常用链接

留言簿(3)

随笔分类(58)

随笔档案(58)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

PreTranslateMessage和GetKeyState的一点理解:
    MSDN上的:如果消息完全由PreTranslateMessage就返回非零值,并不再进一步处理.如果消息将以正常的方式处理,就返回零值.
    当我新建一个基于对话框的工程,并加了OnkeyDown函数,再加如下代码想要实现Ctrl+left组合键,但没有任何反应.
 

 if(nChar==VK_LEFT && ::GetKeyState(VK_CONTROL)<0)   
 
{   
  MessageBox(
"left","test",MB_OK);   
 }

 

    上网查了资料都是在PreTranslateMessage对消息进行判断,虽然最好的方法是在这里实现,但我比较喜欢尝试,想在这里实现.
网上都说在PreTranslateMessage实现,我就在我的工程中去看看PreTranslateMessage函数,当我查了MSDN后终于明白了,我的消息
全由默认的函数处理了,到OnkeyDown函数中就处理不了了,我把PreTranslateMessage函数改成下面的样子就可以了!

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
{
 
// TODO: Add your specialized code here and/or call the base class
   
 
return 0;//CDialog::PreTranslateMessage(pMsg);
}

 


    这里还有一个问题,关于GetKeyState的,查MSDN后知道它的返回值有三种状态的,有按下和弹起以及类似于大小写转键的触发态.
但在这里我们不用到触发态,按下返回负值,弹起返回正值,如果上面我们没有对GetKeyState的返回值判断正负:
当你第一次按左键时,也会弹出一个对话框,原因是GetKeyState返回非零值;
若你第一次按Ctrl+left时也会弹出对话框,但第二次不用按Ctrl只按左键也会弹出对话框,因为你那时已经触发了Ctrl键,再按一次
Ctrl+left;下次按left就不会弹出对话框了,那时Ctrl失效了!(这里是失效还是弹起分不清代,调试看它的返回值,应该是弹出,因为
按下Ctrl的值时它的值都在-127和-128两值变化,即最高位(the high-order bit)是1,最低位(the low-order bit)恒为1)
但感觉上还是失效,不然也不用第二次来恢复Ctrl的使用!!!!!!!
所以上面的GetKeyState必须判断返回值的正负!

posted on 2008-10-28 16:21 Dragon 阅读(2098) 评论(0)  编辑 收藏 引用 所属分类: VC

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © Dragon Powered by: 博客园 模板提供:沪江博客