2012-02-14 57 views
1

我有,我認爲是不正確發送的消息WM_KEYUP產生的問題。我相信,當你移動你的角色時,Minecraft會發生同樣的問題,並且輸入會「卡住」。按下按鍵後,按鍵的動作繼續,直到再次按下該按鍵時纔會停止。我聽說它可能是Windows和鍵盤之間的問題,但我不完全確定。另外,大多數其他主流遊戲都沒有這個問題,所以必須有一個正確的方法來做到這一點。這是我的windows程序代碼如下所示:由於卡住鍵盤輸入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對象中使用互斥。

我得到這個問題比我的世界更在我的比賽,我不知道爲什麼。當我做更簡單的非多線程代碼時,我也知道了。我不知道如何解決這個問題。

我明白任何幫助或建議,任何人所提供的。

+0

那麼,你在關注WM_ACTIVATEAPP嗎? – 2012-02-14 00:19:46

回答

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; 
}