读书人

MsgWaitForMultipleObjects 不能捕捉到

发布时间: 2012-04-08 14:38:30 作者: rapoo

MsgWaitForMultipleObjects 不能捕捉到按键事件
我创建一个键盘的事件
在MsgWaitForMultipleObjects中等待,不能正确的捕捉到键盘按下的事件
//--- 创—XInput 接口
IDirectInput8* Input=0;
HRESULT hr=0;
hr = DirectInput8Create(
hInstance,
DIRECTINPUT_VERSION,
IID_IDirectInput8,
(void**)&Input,
NULL);
if(FAILED(hr))
{
return FALSE;
}

//=================KeyBoard
LPDIRECTINPUTDEVICE8 KeyBoardDevice=0;
hr=Input->CreateDevice(GUID_SysKeyboard,&KeyBoardDevice,NULL);
if(FAILED(hr))
{
return FALSE;
}

//设置数据格式
hr=KeyBoardDevice->SetDataFormat(&c_dfDIKeyboard);
if(FAILED(hr))
{
//d3d::Release<IDirectInputDevice8*>(KeyBoardDevice);
//d3d::Release<IDirectInput8*>(Input);
return FALSE;

}
//设置设备协调级别
hr=KeyBoardDevice->SetCooperativeLevel(
hWnd,
DISCL_FOREGROUND|DISCL_EXCLUSIVE
);
if(FAILED(hr))
{
//d3d::Release<IDirectInputDevice8*>(KeyBoardDevice);
//d3d::Release<IDirectInput8*>(Input);
return FALSE;
}


HANDLE hKeyboardEvent= CreateEvent( NULL,FALSE,FALSE,NULL );
//为DirectInput设备设定Event对象
hr = KeyBoardDevice->SetEventNotification(hKeyboardEvent);
if(FAILED(hr))
{
MessageBoxA(NULL,"event error","a",0);
}

HANDLE objectHandleArray[]={hKeyboardEvent};
while(1)
{
DWORD dwResult = ::MsgWaitForMultipleObjects(1,objectHandleArray,FALSE,INFINITE,QS_ALLINPUT);
if (dwResult == WAIT_OBJECT_0) {
// Event is set. If the event was created as
// autoreset, it has also been reset.
//设置缓冲区

MessageBoxA(NULL,"key down","a",0);
hr=KeyBoardDevice->Acquire();
if(FAILED(hr))
{
return FALSE;
}
char keyBuffer[256];
hr=KeyBoardDevice->GetDeviceState(sizeof(keyBuffer),(LPVOID)keyBuffer);
if(hr==DIERR_INPUTLOST)
{
KeyBoardDevice->Acquire();//重新获得使用权
hr=KeyBoardDevice->GetDeviceState(sizeof(keyBuffer),
(LPVOID)keyBuffer);
if(FAILED(hr))
{
return FALSE;
}
}
//获得按键状态keyboard device
if(keyBuffer[DIK_A]& 0X80)
{

MessageBoxA(NULL,"key","a",0);
}
}
// Main message loop:
if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}


[解决办法]
1.每次按按键的时候有down和up 两个状态的。窗口关闭后,正常情况下不能接受按键消息了,所以就不能触发。
2.调试和直接运行的路径默认情况下是不一致的,所以你最好用GetModuleFileName解析到绝对路径,然后再加以使用
[解决办法]
如果只能获取一次按键,可能是event没有set的原因;
[解决办法]
MessageBox是模态对话框,我个人感觉可能是模态对话框对键盘消息响应的影响

读书人网 >C++

热点推荐