現在、私は独自の関数 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;
}