Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Нажатие стрелок С++

#cpp #windows #winapi


Решил написать консольного Марио и столкнулся с такой проблемой: как отлавливать
событие нажатия стрелок на клавиатуре, скажем через WinApi или при помощи стандартных
средств с++? (Windows)

void Game::input()
{
    Key key;
    char c;
    while (true)
    {
        cin >> c;
        switch (c)
        {
        case up_key:
            movePlayer(player_pos + new Position(0, -3));
            break;
        case down_key:
            movePlayer(player_pos + new Position(0, 1));
            break;
        case right_key:
            movePlayer(player_pos + new Position(1, 0));
            break;
        case left_key:
            movePlayer(player_pos - new Position(1, 0));
            break;
        }
        show();
    }
}

    


Ответы

Ответ 1



Ну, в консоли Windows можно воспользоваться не входящей в стандарт, но входящей в SDK getch() #include #include int main(int argc, const char * argv[]) { int k1, k2; for(;;) { k1 = _getch(); if (k1 == 0xE0 || k1 == 0x00) { k2 = _getch(); switch(k2) { case 0x4B: printf("Left on %s kbd\n", k1 ? "main" : "extended"); break; case 0x48: printf("Up on %s kbd\n", k1 ? "main" : "extended"); break; case 0x4D: printf("Right on %s kbd\n", k1 ? "main" : "extended"); break; case 0x50: printf("Down on %s kbd\n", k1 ? "main" : "extended"); break; } } } }

Ответ 2



Хуки нужно юзать, хуки ) #include #include #define _WIN32_WINNT 0x050 LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam ) { BOOL fEatKeystroke = FALSE; if( nCode == HC_ACTION ) { switch( wParam ) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam; if( fEatKeystroke = (p->scanCode == 0x48) ) { printf( "UP\n" ); /*keybd_event( 'B', 0, 0, 0 ); keybd_event( 'B', 0, KEYEVENTF_KEYUP, 0 );*/ break; } if( fEatKeystroke = (p->scanCode == 0x4B) ) { printf( "LEFT\n" ); /*keybd_event( 'B', 0, 0, 0 ); keybd_event( 'B', 0, KEYEVENTF_KEYUP, 0 );*/ break; } if( fEatKeystroke = (p->scanCode == 0x4D) ) { printf( "DOWN\n" ); /*keybd_event( 'B', 0, 0, 0 ); keybd_event( 'B', 0, KEYEVENTF_KEYUP, 0 );*/ break; } if( fEatKeystroke = (p->scanCode == 0x50) ) { printf( "RIGHT\n" ); /*keybd_event( 'B', 0, 0, 0 ); keybd_event( 'B', 0, KEYEVENTF_KEYUP, 0 );*/ break; } break; } } return(fEatKeystroke ? 1 : CallNextHookEx( NULL, nCode, wParam, lParam )); } int main() { // Install the low-level keyboard & mouse hooks HHOOK hhkLowLevelKybd = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0 ); // Keep this app running until we're told to stop MSG msg; while( !GetMessage( &msg, NULL, NULL, NULL ) ) { //this while loop keeps the hook TranslateMessage( &msg ); DispatchMessage( &msg ); } UnhookWindowsHookEx( hhkLowLevelKybd ); return(0); }

Комментариев нет:

Отправить комментарий