VC6.0环境下,对话框内可以使用热键,
在单文档程序中想接收组合键"ALT+X"消息,
testHotKey.h和testHotKey.cpp是对话框程序中正常使用的代码;
CKeyView.h和CKeyView.cpp,是单文档程序中代码,
感觉GetKeyState使用有点问题,
请大家帮忙看下,谢谢!/****** testHotKey.h ******/
public:
  virtual BOOL DestroyWindow();
protected:
  afx_msg void OnHotKey(WPARAM wp,LPARAM lp);/****** testHotKey.cpp ******/
ON_MESSAGE(WM_HOTKEY,OnHotKey)/*注册热键*/
BOOL CtestHotKeyDlg::OnInitDialog()
{::RegisterHotKey(m_hWnd,199,MOD_ALT,'X');}void CtestHotKeyDlg::OnHotKey(WPARAM wp,LPARAM lp)
{ /*收到Alt+X组合键信息,处理业务逻辑*/
if(wp==199)
{//处理业务逻辑           
}
}
BOOL CtestHotKeyDlg::DestroyWindow() 
{  /*释放热键*/     
::UnregisterHotKey(m_hWnd,199);
return CDialog::DestroyWindow();
}
//////////////////////////////////////////////////////////
/****** CKeyView.h ******/
protected:
  afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);/****** CKeyView.cpp ******/
//{{AFX_MSG_MAP(CKeyView)
ON_WM_CHAR()
//}}AFX_MSG_MAPvoid CKeyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{  /*接收组合键消息,处理业务逻辑*/
   CKeyDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);   
   /*感觉检查Ctrl是否被按下,有点问题???*/
   if ((int)GetKeyState(VK_CONTROL) < 0) 
   { if (nChar == 'X')
{ /*处理业务逻辑*/ }
    }
    CView::OnChar(nChar, nRepCnt, nFlags);
    Invalidate();
}

解决方案 »

  1.   

    if(GetKeyState(VK_CONTROL) & 0x8000)
    {
     if(nChar == _T('X')
     {
      ....
     }
    }
      

  2.   

    /*接收到Ctrl+e组合键消息,处理业务逻辑*/
    /*按下组合键时,字符消息接收有问题???*/
    void CTest0819View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    int k = -1;
    if(GetKeyState(VK_CONTROL) & 0x8000)
    {
    /* 按下字母e(小写),nChar = 101 , k = -1
    按下"Ctrl+e"组合键,nChar = 5 , k = -1
    */ 
            if(nChar == 'e')
    {  k =111;  }
    }
    CView::OnChar(nChar, nRepCnt, nFlags);
    }
      

  3.   

    判断字符的时,使用下面的判断都不可以
    if(nChar == 'e')
    if(nChar == 'E')
    if(nChar == _T('e'))
    if(nChar == _T('E'))
      

  4.   

    我把if(nChar == 'e')
    修改成if(nChar == 5),应该可以了
      

  5.   

    void CTest0819View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    if(GetKeyState(VK_CONTROL) & 0x8000)
    {
            if(nChar == 2)  /*Ctrl+b*/
    {  AfxMessageBox("2222");
    }
    else if(nChar == 5) /*Ctrl+e*/
            {  AfxMessageBox("5555");

    else if (nChar == 9) /*Ctrl+i*/
    {
    AfxMessageBox("9999");
    }
    }
    CView::OnChar(nChar, nRepCnt, nFlags);
    }