重新获取设备的有关问题

重新获取设备的问题
最近写了个小游戏,发现一个bug,运行时,要是切换到别的程序,再回来 ,就无法重新获取键盘的输入了。
我 在判断键盘按键函数里面有判断的 ,如果获取不到 键盘输入,就重新获取键盘的使用权

if(DIERR_INPUTLOST==m_pKeyboardDevice->GetDeviceState(sizeof(m_KeyBuffer),(LPVOID)m_KeyBuffer)){
m_pKeyboardDevice->Acquire(); //重新获取键盘的使用权

但是,没有起到想要 的作用,跟踪调试发现,当切换到别的程序之后,会立刻进入该if 语句内部,由于此时是在别的界面,所以m_pKeyboardDevice->Acquire();会失败,这没有问题。但是,当重新切换回来,发现程序无法没有执行到if 里面了,
所以不会执行m_pKeyboardDevice->Acquire();语句,这是为什么?

另外 ,我把m_pKeyboardDevice->Acquire();语句放到 if外面,就是下面注释的那个地方,这样程序就能正常了
。切换回来,程序也可以继续接收键盘。

但是我很纳闷,为什么放到if里面就不可以呢?





C/C++ code
//判断用户按键函数
bool CGameEngine_Input::ReadKeyboard(){  
    //m_pKeyboardDevice->Acquire();  //使用该语句就可以重新获取
    
    if(DIERR_INPUTLOST==m_pKeyboardDevice->GetDeviceState(sizeof(m_KeyBuffer),(LPVOID)m_KeyBuffer)){
        m_pKeyboardDevice->Acquire();  //重新获取键盘的使用权
        
        if(FAILED(m_pKeyboardDevice->GetDeviceState(sizeof(m_KeyBuffer),(LPVOID)m_KeyBuffer))){
            return false;
        }
    }
    return true;
}


------解决方案--------------------
关于设备丢失的问题已经讨论过很多了,建议楼主在论坛里自己搜索一下
------解决方案--------------------
C/C++ code

#include "ENinput.h"
HRESULT ENInput::LHxxGET_INPUTCHAR(UINT msg, WPARAM wparam, LPARAM lparam ,
                                   char *buffer)
{
    if((msg == WM_CHAR) && (wparam != VK_RETURN) )//接收输入消息
    {
        int len;
        switch(wparam)
        {
        case VK_BACK: // backspace, delete 2 char if chn, delete 1 char if eng
            len=lstrlen(buffer);
            if (len>0)
            {
                if ( buffer[len-1] < 0 && len > 1 ) // chinese character
                {
                    buffer[len-1]=0;
                    buffer[len-2]=0;
                }
                else 
                    buffer[len-1]=0;
            }
            break;
        default: // catch the string
            if (lstrlen(buffer)>99)
                break;
            char Chat[2];
            Chat[0]=(char)wparam;
            Chat[1]=0;
            lstrcat(buffer,Chat);
            break;
        }
    }
    return 0;
}


    //---------------------------
    //name:LHxxGET_INPUTCHAR()
    //Desc :读输入信息,和检测鼠标没按
    //Parameter: 
    //  msg                :回调窗口参数
    //  wparam            :回调窗口参数
    //  lparam            :回调窗口参数
    //  buf                :保存输入信息
    //  LkeyDown        :鼠标左key不按下了会设0
    //  RkeyDown        :鼠标右key不按下了会设0
    //---------------------------
    HRESULT LHxxGET_INPUTCHAR(UINT msg, WPARAM wparam, LPARAM lparam ,char *buffer);

------解决方案--------------------
用它的位移你根本算不出屏幕绝对坐标的,说了太灵敏了