重新获取设备的有关问题
重新获取设备的问题
最近写了个小游戏,发现一个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里面就不可以呢?
------解决方案--------------------
关于设备丢失的问题已经讨论过很多了,建议楼主在论坛里自己搜索一下
------解决方案--------------------
最近写了个小游戏,发现一个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);
------解决方案--------------------
用它的位移你根本算不出屏幕绝对坐标的,说了太灵敏了