0

現在、私は独自の関数 onPress と onRelease を作成しています。ただし、 onRelease 関数に問題があります。どうやら、キーボードを離していなくても onRelease がトリガーされ続けていたようです。

CPU内部のサイクル数と関係があるのではないかと疑っていましたが、この理論はよくわかりませんでした。どういうわけか、サイクルが私のフレームよりも遅いのかもしれません。なぜ PeerMessage が false を返すのでしょうか? イベントがトリガーされなかったので。

解決策: **WinProc 関数の下に、WM_KEYUP という名前の新しいケースを作成します。このイベントは、ユーザーがボタンから離れるとトリガーされます。発行された CPU 内部のサイクル数を解決するのに役立ちます。**

*注: コードの詳細を更新しました。

説明。ウィンドウ プログラミング キーボード データを格納する 2 つの std::array があります 1) InputCurr 2) InputPrev

std::array<char, 256> inputPrev;
std::array<char, 256> inputCurr;

While(TRUE) {
    std::copy(InputCurr.begin(), InputCurr.end(), InputPrev.begin());
    inputCurr.fill(0);

    while(PeekMessage (&uMsg, NULL, 0, 0, PM_REMOVE))
    {
        TranslateMessage (&uMsg);
        DispatchMessage (&uMsg);
    }

    if(onReleased(x030))  //Button 0
    //do something
}

char onReleased(char key)
{
    return (inputCurr[key] && !inputPrev[key])? 1 : 0;
}

void VEInputMessage(WPARAM key)
{
    inputCurr[key]= 1;  //Set to true of the keyboard key
}

LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{
    HDC dc;           /* device context */
    PAINTSTRUCT ps;   /* the paint struct */
    RECT rect;

    UNREFERENCED_PARAMETER(rect);

    switch (msg)
    {
    /* when the window is created */
    case WM_CREATE:
        break;

    /* when the rectangle is drawn */
    case WM_LBUTTONDOWN:
            break;

    case WM_MOUSEMOVE:
        break;

    case WM_PAINT:
        dc = BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        break;

    /* When it's time for the window to be closed and removed */
    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    case WM_KEYDOWN:
        VEINPUT::VEInputMessage(wParam);  //Updated the input key 
        if(wParam == AEVK_ESCAPE)
            PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}
4

0 に答える 0