Как исправить ошибку управления ключами и мышью в C - PullRequest
0 голосов
/ 02 июня 2019

Я делаю страницу входа с C в моей программе. Я должен сделать эту программу только с C., но программа не работает, когда я нажимаю клавишу со стрелкой и клавишу ввода. когда я нажал клавишу со стрелкой, я хочу войти - кнопка изменения учетной записи изменилась. но кнопка не работает. и когда я нажал на поле ввода логина и нажал клавишу Enter, чтобы выйти, но он не работает.

Я использую

oldmenu = menu;
menu = getInput;

чтобы решить проблему с клавишей Enter. когда я нажал на поле ввода логина и нажал клавишу Enter, чтобы выйти, но он запустился ChangeLogin();. Я думаю, что это проблема меню. но сейчас это не работает. это меню контроля входа в систему.

int get_input_login(WORD* vkey, COORD* pos, int* menu, int* check, login* tmpID)
{
    INPUT_RECORD input_record;
    DWORD input_count;
    int oldmenu;

    ReadConsoleInput(CIN, &input_record, 1, &input_count);
    switch (input_record.EventType)
    {
    case MOUSE_EVENT:
        if (pos && (input_record.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)) // Left button clicked
        {
            CONSOLE_SCREEN_BUFFER_INFO csbi;

            GetConsoleScreenBufferInfo(COUT, &csbi);

            *pos = input_record.Event.MouseEvent.dwMousePosition;
            pos->X -= csbi.srWindow.Left;
            pos->Y -= csbi.srWindow.Top;
            if (pos && (input_record.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)) //left button pressed
            {
                if (pos->X > 26 && pos->X <= 39)    // id, psword
                {
                    if (pos->Y == 6)            // id inputbox
                    {
                        oldmenu = menu;
                        menu = getInput;
                        gotoxy(26, 6); PrintLoginInputbox();
                        gotoxy(27, 6); textcolor(BLACK, WHITE);
                        input_id(tmpID->ID, maxlogincharacter);
                        textcolor(WHITE, GetStdHandle(STD_OUTPUT_HANDLE));
                        menu = oldmenu;
                    }
                    else if (pos->Y == 8)   // psword inputbox
                    {
                        oldmenu = menu;
                        menu = getInput;
                        gotoxy(26, 8); PrintLoginInputbox();
                        gotoxy(27, 8); textcolor(BLACK, WHITE);
                        input_pw(tmpID->PW, maxlogincharacter);
                        textcolor(WHITE, GetStdHandle(STD_OUTPUT_HANDLE));
                        menu = oldmenu;
                    }
                }
                else if (pos->Y == 14)
                {
                    if (pos->X > 7 && pos->X < 19)      // button : login
                    {
                        if (strcmp(tmpID->ID, keyID.ID) != 0 && strcmp(tmpID->PW, keyID.PW) != 0)
                            check = 1;  // login success
                    }
                    else if (pos->X > 35 && pos->X < 47)    // button : change account
                        ChangeLogin();
                }
            }
        }
    case KEY_EVENT:
        if (input_record.Event.KeyEvent.bKeyDown)
        {
            switch (input_record.Event.KeyEvent.wVirtualKeyCode)
            {
            case VK_LEFT:
            case VK_RIGHT:
                if (menu == loginButton)    // when menu = login button
                {
                    menu = changePageButton; PrintLoginButtons(menu);
                }
                else if (menu == changePageButton)  // when menu = changePageButton button
                {
                    menu = loginButton; PrintLoginButtons(menu);
                }
                break;
            case VK_RETURN:
                if (menu == loginButton)
                {
                    if (strcmp(tmpID->ID, keyID.ID) != 0 || strcmp(tmpID->PW, keyID.PW) != 0)
                        saveID();
                    check = 1;  // login success
                }
                else if (menu == changePageButton)
                    ChangeLogin();
            }
        }
    }
}

и это меню входа в систему.

void input_id(char* buf, int size)
{
    int cnt = 0, key;  // count, key 

    while (1)
    {
        key = getch();  // input one character

        if (key == VK_RETURN)  // break when Enter pressed
            break;

        buf[cnt++] = (char)key; 
        printf("%c",key);

        if (cnt == size - 1)
            break;
    }

    buf[cnt] = '\0';
}
...