响应键盘两个按键同时按下 mfc

时间:2023-02-20 09:25:36
求各位高手帮忙看下 我要实现的功能是键盘按下scroll Lock键(指示灯亮的时候)后,再按下左右方向键 实现位图的左右移动 但当scroll Lock键没有按下(指示灯不亮)时位图不动 代码如下:
BOOL CFccTestDlg::PreTranslateMessage(MSG* pMsg) 
{

if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE) 
   return   TRUE;

  if(pMsg->message==WM_KEYDOWN)
{
       ProcessHotKey(pMsg->wParam);
       return TRUE;
}

return CDialog::PreTranslateMessage(pMsg);
}
void CFccTestDlg::ProcessHotKey(WPARAM wParam)
{
    CWnd   *a; 
int     nFullWidth=GetSystemMetrics(SM_CXSCREEN);    
int     nFullHeight=GetSystemMetrics(SM_CYSCREEN); 
  CRect rect;
  (this->GetDlgItem(IDC_PIC))->GetWindowRect(&rect);
  CPoint p(rect.left,rect.top);
    int px=rect.left;
    switch(wParam)
  {
  case VK_LEFT:
if (GetAsyncKeyState(VK_SCROLL)&&0x8000) 
{
   px=px-5;
         a=this-> GetDlgItem(IDC_PIC); 
       a-> SetWindowPos(NULL,px,rect.top,8,5,1);
  if((px+rect.Width())<0)
  {
  a-> SetWindowPos(NULL,nFullWidth-rect.Width()/2,rect.top,8,5,1);
  }
else if(px>nFullWidth)
  {
  a-> SetWindowPos(NULL,0,rect.top,8,5,1);
  }
}
  RefreshPromptInfo();//刷新
 
  break;

  case VK_RIGHT:
if (GetAsyncKeyState(VK_SCROLL)&&0x8000) 
{
   px=px+5; 
   a=this-> GetDlgItem(IDC_PIC); 
          a-> SetWindowPos(NULL,px,rect.top,8,5,1);
  if(px<0)
  {
     a-> SetWindowPos(NULL,nFullWidth-rect.Width()/2,rect.top,8,5,1);
  }
  else if(px>nFullWidth)
  {
    a-> SetWindowPos(NULL,0,rect.top,8,5,1);
}
}
  RefreshPromptInfo();//刷新

  break;

    }
}

这段代码不管scroll Lock键按下与否 按左右方向键都不能移动位图 当我屏蔽掉if (GetAsyncKeyState(VK_SCROLL)&&0x8000)后不管scroll Lock键按下与否 按下左右方向键位图都能移动 为什么?哪里出错了?还请高手指教!

8 个解决方案

#1



switch(wParam)
     {
     case VK_LEFT:
    if (GetAsyncKeyState(VK_SCROLL) &0x8000) 
    {
          px=px-5;
         a=this-> GetDlgItem(IDC_PIC); 
          a-> SetWindowPos(NULL,px,rect.top,8,5,1);
         if((px+rect.Width())<0)
         {
         a-> SetWindowPos(NULL,nFullWidth-rect.Width()/2,rect.top,8,5,1);
         }
        else if(px>nFullWidth)
         {
         a-> SetWindowPos(NULL,0,rect.top,8,5,1);
         }
    }
         RefreshPromptInfo();//刷新
                 
             break;

     case VK_RIGHT:
    if (GetAsyncKeyState(VK_SCROLL) &0x8000) 
    {
          px=px+5; 
          a=this-> GetDlgItem(IDC_PIC); 
...
这个目前找到的逻辑错误,先看看是不是这里的问题

#2


"if (GetAsyncKeyState(VK_SCROLL)&&0x8000)”
这里是要:求与,不是求并,有可能是这个地方写错了吧~~~

#3


引用 1 楼 zjfhgdx 的回复:
switch(wParam)
  {
  case VK_LEFT:
  if (GetAsyncKeyState(VK_SCROLL)&amp;0x8000) 
  {
  px=px-5;
  a=this-> GetDlgItem(IDC_PIC); 
  a-> SetWindowPos(NULL,px,rect.top,8,5,1);
  if((px+rect.Widt……

不行啊 运行了 位图还是不能动

#4


你不应该检测scroll lock键的动作
应该检测scroll lock的状态

#5


引用 4 楼 xianglitian 的回复:
你不应该检测scroll lock键的动作
应该检测scroll lock的状态
GetAsyncKeyState(VK_SCROLL)不就是检测scroll lock的状态吗?还有其他的什么方法?我刚接触mfc 还请大侠多多指教!

#6


你误会了
GetAsyncKeyState(VK_SCROLL)检测的也是按键的状态
也就是说你按着scroll lock键时再按上下左右键就会起作用
你可以试一下
但是你想检测的是scroll lock知识灯的状态
而不是这个按键的动作
对吧

#7


if(GetKeyState(VK_SCROLL) < 0)
{
  // Press Down
}

#8


引用 6 楼 xianglitian 的回复:
你误会了
GetAsyncKeyState(VK_SCROLL)检测的也是按键的状态
也就是说你按着scroll lock键时再按上下左右键就会起作用
你可以试一下
但是你想检测的是scroll lock知识灯的状态
而不是这个按键的动作
对吧
嘿嘿 对 你说的很对 当按下scroll lock键不放才能实现我想要的功能 明白了 要检测指示灯的状态 
GetKeyState(VK_SCROLL) & 1 
功能已经完成了 谢谢各位的指导~非常地!

#1



switch(wParam)
     {
     case VK_LEFT:
    if (GetAsyncKeyState(VK_SCROLL) &0x8000) 
    {
          px=px-5;
         a=this-> GetDlgItem(IDC_PIC); 
          a-> SetWindowPos(NULL,px,rect.top,8,5,1);
         if((px+rect.Width())<0)
         {
         a-> SetWindowPos(NULL,nFullWidth-rect.Width()/2,rect.top,8,5,1);
         }
        else if(px>nFullWidth)
         {
         a-> SetWindowPos(NULL,0,rect.top,8,5,1);
         }
    }
         RefreshPromptInfo();//刷新
                 
             break;

     case VK_RIGHT:
    if (GetAsyncKeyState(VK_SCROLL) &0x8000) 
    {
          px=px+5; 
          a=this-> GetDlgItem(IDC_PIC); 
...
这个目前找到的逻辑错误,先看看是不是这里的问题

#2


"if (GetAsyncKeyState(VK_SCROLL)&&0x8000)”
这里是要:求与,不是求并,有可能是这个地方写错了吧~~~

#3


引用 1 楼 zjfhgdx 的回复:
switch(wParam)
  {
  case VK_LEFT:
  if (GetAsyncKeyState(VK_SCROLL)&amp;0x8000) 
  {
  px=px-5;
  a=this-> GetDlgItem(IDC_PIC); 
  a-> SetWindowPos(NULL,px,rect.top,8,5,1);
  if((px+rect.Widt……

不行啊 运行了 位图还是不能动

#4


你不应该检测scroll lock键的动作
应该检测scroll lock的状态

#5


引用 4 楼 xianglitian 的回复:
你不应该检测scroll lock键的动作
应该检测scroll lock的状态
GetAsyncKeyState(VK_SCROLL)不就是检测scroll lock的状态吗?还有其他的什么方法?我刚接触mfc 还请大侠多多指教!

#6


你误会了
GetAsyncKeyState(VK_SCROLL)检测的也是按键的状态
也就是说你按着scroll lock键时再按上下左右键就会起作用
你可以试一下
但是你想检测的是scroll lock知识灯的状态
而不是这个按键的动作
对吧

#7


if(GetKeyState(VK_SCROLL) < 0)
{
  // Press Down
}

#8


引用 6 楼 xianglitian 的回复:
你误会了
GetAsyncKeyState(VK_SCROLL)检测的也是按键的状态
也就是说你按着scroll lock键时再按上下左右键就会起作用
你可以试一下
但是你想检测的是scroll lock知识灯的状态
而不是这个按键的动作
对吧
嘿嘿 对 你说的很对 当按下scroll lock键不放才能实现我想要的功能 明白了 要检测指示灯的状态 
GetKeyState(VK_SCROLL) & 1 
功能已经完成了 谢谢各位的指导~非常地!