2012-02-14 2 views
1

wm_keyup 메시지가 올바르게 전송되지 않아서 발생한다고 생각되는 문제가 있습니다. 나는 당신이 당신의 캐릭터를 움직일 때 동일한 문제가 Minecraft에서 발생하고 입력이 '막히게 될 것'이라고 믿는다. 키의 동작은 누른 후에도 계속되고 키를 다시 누를 때까지 중지되지 않습니다. 창과 키보드 사이에 문제가 될 수 있다고 들었지만 완전히 확신 할 수는 없습니다. 또한 대부분의 다른 주류 게임에는이 문제가 없으므로 올바른 방법이 있어야합니다.wm_keyup으로 인해 키보드 입력이 중단됨

case WM_KEYDOWN: 
     for (list<KeyInput>::iterator t = key_inputs.begin(); t != key_inputs.end(); ++t) 
      (*t).PushKeyDown(ConvertKeyCode(wparam)); 
    return 0; 

    case WM_KEYUP: 
     for (list<KeyInput>::iterator t = key_inputs.begin(); t != key_inputs.end(); ++t) 
      (*t).PushKeyUp(ConvertKeyCode(wparam)); 
    return 0; 

각 KeyInput 객체가 키 입력을 채워집니다 및 키보드 입력이 요청으로 비워 큐를 가지고 :이처럼 내 윈도우 프로 시저 코드는 모습입니다. 이 코드는 멀티 스레드 게임용이며이 기술은 모든 스레드에서 입력이 누락되지 않도록합니다. KeyInput 객체에서 상호 배제를 사용하고 있습니다.

내 게임에서 Minecraft보다이 문제가 더 많이 발생하고 이유가 없습니다. 이전에 단순하고 비 멀티 스레드 코드를 작성했을 때도 알았습니다. 이 문제를 해결하는 방법을 모르겠습니다.

누구든지 제공하는 도움이나 제안에 감사드립니다.

+0

글쎄, WM_ACTIVATEAPP에 신경을 쓰고 있습니까? –

답변

0

WM_KEYDOWN 메시지에 대한 설명서를 살펴본 결과 lparam의 31 번째 비트가 마지막 keydown 메시지가 최신 것과 동일한 지 여부를 알 수있었습니다. 이 정보를 사용하여 반복 메시지를 무시하면 문제를 해결할 수 있습니다 (그러나 키를 누르고 있으면 반복 입력이 손실됩니다). 여기 내 코드는 다음과 같습니다.

case WM_KEYDOWN: 
{ 
    union 
    { 
     uint lparam; 
     struct { uint bits:30,_30:1,_31:1; }; 
    } lparam_data; 
    lparam_data.lparam = lparam; 

    if (!lparam_data._30) 
     // key was pushed 
    return 0; 
} 
관련 문제