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

如何在对话框中响应快捷键?

楼主danial(孤鸿)2000-04-29 17:22:00 在 VC/MFC / 基础类 提问

我要在基于对话框的程序中响应快捷键,比如按“CTRL+0”系统就调用相应的处理函数,请问该如何实现? 问题点数:50、回复次数:10Top

1 楼wild()回复于 2000-04-29 20:16:00 得分 0

方法有很多,提供几个思路:  
  可以重载PreTranslateMessage()捕获WM_KEYDOWN消息,并处理某一键值。  
  可以通过键盘HOOK.Top

2 楼danial(孤鸿)回复于 2000-05-10 11:12:00 得分 0

谢谢wild提供的思路。能否给出PreTranslateMessage()实现的源代码以供参考?Top

3 楼wild()回复于 2000-05-11 01:33:00 得分 0

BOOL   CMyEditCtrl::PreTranslateMessage(MSG   *   pMsg)  
  {  
      switch(pMsg->message)  
      {  
      case   WM_KEYDOWN:  
          switch(pMsg->wParam)  
          {  
          case   CTRL_0:   /*handle   Ctrl-0*/   return   TRUE;   //end   the   message   routing  
          default:   break;  
          }  
          break;  
           
   
   
      //   TO   Handle   more   messages   here.  
      //   case   WM_xxx:   break;  
      default:   break;  
      }  
      //   default   handle   of   Edit   control  
      return   CEdit::PreTranslateMessage(pMsg);  
  }Top

4 楼danial(孤鸿)回复于 2000-05-18 15:01:00 得分 0

VC好象不能识别CTRL_0宏吧?Top

5 楼danial(孤鸿)回复于 2000-06-08 12:36:00 得分 0

我现在要响应的快捷键是复合键,可在用PreTranslateMessage()捕获消息WM_KEYDOWN时,刚按下一个键(如Ctrl或0)就进入PreTranslateMessage()函数,请问我该如何同时检测到Ctrl和0键的按下呢?Top

6 楼wild()回复于 2000-06-09 01:28:00 得分 0

用GetKeyState()吧,可以检测所有键的状态  
      SHORT   GetKeyState(  
            int   nVirtKey       //   virtual-key   code  
      );  
    If   the   high-order   bit   is   1,   the   key   is   down;   otherwise,   it   is   up.    
  If   the   low-order   bit   is   1,   the   key   is   toggled.   A   key,   such   as   the   caps   lock   key,   is   toggled   if   it   is   turned   on.   The   key   is   off   and   untoggled   if   the   low-order   bit   is   0.   A   toggle   key's   indicator   light   (if   any)   on   the   keyboard   will   be   on   when   the   key   is   toggled,   and   off   when   the   key   is   untoggled.    
   
  另外,可以参考   GetKeyboardState,   SetKeyboardState,   GetAsyncKeyState,   GetKeyState,   and   MapVirtualKey  
   
  详细情况查MSDN,注意这个函数区分左右Control,Alt,and   Shift.  
   
  !!!  
  不妨这样做:  
  PreTranslate中捕获   0   键按下消息,这时使用GetKeyState(),   检测VK_RCTRL   and   VK_LCTRL,如下:  
  BOOL   CMyDialog::PreTranslateMessage(MSG   *   pMsg)  
  {  
      switch(pMsg->message)  
      {  
      case   WM_KEYDOWN:  
          switch(pMsg->wParam)  
          {  
          case   VK_0:    
  /*handle   Ctrl-0*/   return   TRUE;   //end   the   message   routing  
          default:   break;  
          }  
          break;  
           
   
   
      //   TO   Handle   more   messages   here.  
      //   case   WM_xxx:   break;  
      default:   break;  
      }  
      //   default   handle   of   Edit   control  
      return   CEdit::PreTranslateMessage(pMsg);  
  }Top

7 楼wild()回复于 2000-06-09 01:30:00 得分 50

用GetKeyState()吧,可以检测所有键的状态  
      SHORT   GetKeyState(  
            int   nVirtKey       //   virtual-key   code  
      );  
    If   the   high-order   bit   is   1,   the   key   is   down;   otherwise,   it   is   up.    
  If   the   low-order   bit   is   1,   the   key   is   toggled.   A   key,   such   as   the   caps   lock   key,   is   toggled   if   it   is   turned   on.   The   key   is   off   and   untoggled   if   the   low-order   bit   is   0.   A   toggle   key's   indicator   light   (if   any)   on   the   keyboard   will   be   on   when   the   key   is   toggled,   and   off   when   the   key   is   untoggled.    
   
  另外,可以参考   GetKeyboardState,   SetKeyboardState,   GetAsyncKeyState,   GetKeyState,   and   MapVirtualKey  
   
  详细情况查MSDN,注意这个函数区分左右Control,Alt,and   Shift.  
   
  !!!  
  不妨这样做:  
  PreTranslate中捕获   0   键按下消息,这时使用GetKeyState(),   检测VK_RCTRL   and   VK_LCTRL,如下:  
  BOOL   CMyDialog::PreTranslateMessage(MSG   *   pMsg)  
  {  
      switch(pMsg->message)  
      {  
      case   WM_KEYDOWN:  
          switch(pMsg->wParam)  
          {  
          case   VK_0:  
                    if(GetKeyState(Control   keys)   is   down)  
                    {  
                              //   Handle   here    
                    }  
                    return   TRUE;   //end   the   message   routing  
          default:   break;  
          }  
          break;  
           
   
   
      //   TO   Handle   more   messages   here.  
      //   case   WM_xxx:   break;  
      default:   break;  
      }  
      //   default   handle   of   Dialog  
      return   CDialog::PreTranslateMessage(pMsg);  
  }Top

8 楼guoxiao()回复于 2001-03-01 22:35:00 得分 0

hi,wild  
  hi,danial  
  我也遇到了同样的问题,也没有关于GetKeyState()的参考资料,请问它的返回值是什么?  
  在我使用的参考书上判断Ctrl键是否按下时使用了如下一句:  
                if(GetKeyState(VK_CONTROL)&0x8000)  
                {  
                      if(nChar==.....)  
                      ............  
                  }  
  我不太明白是什么意思,请赐教!  
  Top

9 楼guoxiao()回复于 2001-03-01 22:50:00 得分 0

我使用的详细代码如下:  
  void   NewDlg::OnKeyDown(UINT   nChar,   UINT   nRepCnt,   UINT   nFlags)    
  {  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
  if(GetKeyState(VK_CONTROL))  
  {  
  if(nChar==0x58) //Ctrl+X  
  OnEditCut();  
  if(nChar==0x56) //Ctrl+V  
  OnEditPaste();  
  if(nChar==0x43) //Ctrl+C  
  OnEditCopy();  
  }  
  CDialog::OnKeyDown(nChar,   nRepCnt,   nFlags);  
  }Top

10 楼skt985(傻问天)回复于 2001-06-01 09:42:00 得分 0

71734关注!Top

相关问题

  • 对话框如何响应按键消息?我想用来做按钮快捷键(在线等)
  • 如何在对话框中实现快捷键?
  • 怎么在基于对话框的程序中响应“快捷键消息”
  • 如何在基于对话框的程序中加入快捷键(不用hotkey)
  • 大侠帮忙啊!如何在基于对话框的程序中给菜单加快捷键?
  • 基于对话框的应用程序如何实现ctrl+X的快捷键功能?
  • 请问如何调出DBGridEh的“筛选”对话框(它的快捷键是什么)?
  • 定义的快捷键,想在无模式对话框中响应该消息,但响应不了,请教是何原因?
  • 如何让Button响应快捷键回车"Enter"和退出"Esc"!!
  • 对话框如何响应键盘事件

关键词

  • 函数
  • 检测
  • 消息
  • getkeystate
  • pmsg
  • pretranslatemessage
  • untoggled
  • toggled
  • 快捷键
  • 响应

得分解答快速导航

  • 帖主:danial
  • wild

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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