• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Myszka w konsoli

Object Storage Arubacloud
0 głosów
236 wizyt
pytanie zadane 20 listopada 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)

Tak wiem, założyłem już taki temat ale teraz mam jakiś kod:
 

#include <windows.h>
#include <stdio.h>
#include <vector>

#ifndef MOUSE_HWHEELED
#define MOUSE_HWHEELED 0x0008
#endif

HANDLE hStdin;
DWORD fdwSaveOldMode;

void ErrorExit(LPSTR lpszMessage)
{
    fprintf(stderr, "%s\n", lpszMessage);
    SetConsoleMode(hStdin, fdwSaveOldMode);
    ExitProcess(0);
}

bool KeyEventProc(const KEY_EVENT_RECORD& ker)
{
    printf("key %s: %c\n", ker.bKeyDown ? "pressed" : "released", ker.uChar.AsciiChar);
    return ker.uChar.AsciiChar == 'q';
}

void MouseEventProc(const MOUSE_EVENT_RECORD& mer)
{
    const int X = mer.dwMousePosition.X;
    const int Y = mer.dwMousePosition.Y;
    const int dir = static_cast<int>(mer.dwButtonState) >> 16;
    switch(mer.dwEventFlags)
    {
        case 0:
            if(mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
            {
                printf("left button press @ %d %d\n", X, Y);
            }
            else if(mer.dwButtonState == RIGHTMOST_BUTTON_PRESSED)
            {
                printf("right button press @ %d %d\n", X, Y);
            }
            else
            {
                //You'd need more code here to track releases or more buttons.
                printf("other button press/release @ %d %d\n", X, Y);
            }
            break;
        case DOUBLE_CLICK:
            printf("double click @ %d %d\n", X, Y);
            break;
        case MOUSE_HWHEELED:
            printf("horizontal mouse wheel %s\n", dir >= 0 ? "right" : "left");
            break;
        case MOUSE_WHEELED:
            printf("vertical mouse wheel %s\n", dir >= 0 ? "up" : "down");
            break;
        case MOUSE_MOVED:
            printf("mouse moved: %d %d\n", mer.dwMousePosition.X, mer.dwMousePosition.Y);
            break;
        default:
            printf("unknown mouse event\n");
            break;
    }
}

int main()
{
    hStdin = GetStdHandle(STD_INPUT_HANDLE);
    if(hStdin == INVALID_HANDLE_VALUE)
        ErrorExit("GetStdHandle");

    if(!GetConsoleMode(hStdin, &fdwSaveOldMode))
        ErrorExit("GetConsoleMode");

    DWORD fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
    if(!SetConsoleMode(hStdin, fdwMode))
        ErrorExit("SetConsoleMode");

    std::vector<INPUT_RECORD> irInBuf;
    DWORD numEventsAvailable;
    DWORD lastTickCount = GetTickCount();
    bool finished = false;
    while(!finished)
    {
        GetNumberOfConsoleInputEvents(hStdin, &numEventsAvailable);
        if(numEventsAvailable)
        {
            irInBuf.resize(numEventsAvailable);
            DWORD cNumRead;
            ReadConsoleInput(hStdin, &irInBuf[0], irInBuf.size(), &cNumRead);
            for(DWORD i = 0; i < cNumRead; i++)
            {
                switch(irInBuf[i].EventType)
                {
                    case KEY_EVENT:
                        finished = KeyEventProc(irInBuf[i].Event.KeyEvent);
                        break;
                    case MOUSE_EVENT:
                        MouseEventProc(irInBuf[i].Event.MouseEvent);
                        break;
                    default:
                        break;
                }
            }
        }
        else
        {
            if(GetTickCount() - lastTickCount > 1000)
            {
                lastTickCount = GetTickCount();
                printf("Press 'q' to exit\n");
            }
        }
    }
    SetConsoleMode(hStdin, fdwSaveOldMode);
    return 0;
}

Jeśli ktoś ma prostrzą wersję tego powyżej to prosiłbym o podanie :)
 

Jak to działa?

1 odpowiedź

0 głosów
odpowiedź 20 listopada 2015 przez niezalogowany
Nie podałeś źródła kodu, wyobraź sobie że nam także się nie chce analizować całego kodu i zastanawiać co w ogóle robi.

Pamiętaj, że to pytanie nie tworzysz tylko dla siebie, ale także dla innych, którzy będą mieli podobny problem więc opisz go jakoś, a nie zrobiłeś coś w stylu: "tu macie kod, pomocy!"
komentarz 20 listopada 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
http://stackoverflow.com/questions/20779495/c-use-mouse-and-keyboard-in-console-aplication-without-wait-to-press-any-key

W tytule przeciez jest napisane ze "myszka w konsoli". Ja poprostu chce wiedziec jak to dziala.

Podobne pytania

0 głosów
2 odpowiedzi 966 wizyt
pytanie zadane 31 października 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
0 głosów
1 odpowiedź 98 wizyt
+2 głosów
5 odpowiedzi 347 wizyt

92,555 zapytań

141,403 odpowiedzi

319,558 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...