| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | LARGE_INTEGER perfCountFrequencyResult;
QueryPerformanceCounter(&perfCountFrequencyResult);
int64_t perfCountFrequency = perfCountFrequencyResult.QuadPart;
// Open window (1280x720)
LARGE_INTEGER lastCounter;
QueryPerformanceCounter(&lastCounter);
int64_t lastCycleCount = __rdtsc();
while (app.isRunning)
{
    // Draw around 5 bitmaps (256x256) and a couple of triangles to the screen using OpenGL
    int64_t endCycleCount = __rdtsc();
    LARGE_INTEGER endCounter;
    QueryPerformanceCounter(&endCounter);
    int64_t cycleElapsed = endCycleCount - lastCycleCount;
    int64_t counterElapsed = endCounter.QuadPart - lastCounter.QuadPart;
    float msPerframe = ((1000.0 * (float)counterElapsed) / (float)perfCountFrequency);
    float fps = (float)perfCountFrequency / (float)counterElapsed;
    float mcpf = ((float)cycleElapsed / 1000000.0);
        
    printf("%fms/f / %fFPS / %fMC/F\n", msPerframe, fps, mcpf); // A sample: (0.000018ms/f / 56302504.000000FPS / 22.228949MC/F)
    lastCounter = endCounter;
    lastCycleCount = endCycleCount;
}
 | 
| 1 2 3 | if (WasKeyPressed[KEY_A]) { printf("You pressed key A\n"); }
if (WasKeyReleased[KEY_A]) { printf("You released key A\n"); }
if (IsKeyHeldDown[KEY_A]) { printf("You are holding key A down\n"); } else { /* key is up */ }
 | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | static bool WasKeyPressed[512], WasKeyReleased[512], IsKeyHeldDown[512];
// ... in your WindowProc
switch (message) {
  case WM_KEYUP:
  case WM_KEYDOWN: {
    bool wasUp = !!((lparam >> 30) & 1);
    bool isDown = message == WM_KEYDOWN;
    DWORD key = wparam;
    WasKeyPressed[key] = wasUp & isDown;
    WasKeyReleased[key] = !wasUp & !isDown;
    IsKeyHeldDown[key] = isDown;
    return 0;
  }
// .. in your main game loop
// if you need to do action exactly once when key is being pressed down, like throw one grenade
if (WasKeyPressed[VK_A]) throwGrenade();
// if you need to do action continuously while key is kept pressed down, like move forward
if (IsKeyHeldDown[VK_UP]) moveForward();
 | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | bool IsKeyPressed(int key)
{
    return (vkCode == key) && isDown && wasDown;
}
bool IsKeyDown(int key)
{
    return (vkCode == key) && isDown && !wasDown;
}
bool IsKeyUp(int key)
{
    return (vkCode == key) && !isDown && wasDown;
}
while (/* game loop */)
{
    MSG message;
    while (PeekMessage(&message, 0, 0, 0, PM_REMOVE))
    {
        switch (message.message)
        {
            case WM_SYSKEYDOWN:
            case WM_SYSKEYUP:
            case WM_KEYDOWN:
            case WM_KEYUP:
            {
                vkCode = message.wParam;
                wasDown = ((message.lParam & (1 << 30)) != 0);
                isDown = ((message.lParam & (1 << 31)) == 0);
                // Handle wasPressed, isPressed, isReleased
                }
            } break;
            default:
            {
                TranslateMessage(&message);
                DispatchMessage(&message);
            } break;
        }
    }
    // Do other stuff
}
 |