Obsługa myszki w konsoli Windows

0

Witam!
Szukałem na forum, prawda, temat był poruszany, ale na moje pytanie nie znalazłem odpowiedzi. Chodzi mi o obsługę myszki pod konsolą (Windows) w ten sposób, żeby mi odczytywało jej współrzędne trochę inaczej niż zwykle. Mianowicie nie ma to być odczyt z dokładnością co do piksela, tylko tak, że w standardowej konsoli w lewym, górnym rogu jest powiedzmy (0, 0), a w prawym dolnym (24, 79) (czy coś w tym rodzaju). Czyli odczyt o jedno pole. I tylko w zakresie konsoli. Z wykrywanie klikania jakoś sobię poradzę (może). Zupełnie nie mam pojęcia jak się za to zabrać. Proszę o pomoc ;)

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

HANDLE ccout;
HANDLE ccin;

inline void gotoxy(COORD pos) {
    SetConsoleCursorPosition(ccout, pos);
    }

int main() {
    COORD mousePos = {0,0};
    INPUT_RECORD event = { FOCUS_EVENT };
    DWORD buttons, received;

    ccout = CreateFile(
        "CONOUT$",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        0, OPEN_EXISTING, 0, 0
        );
    ccin = CreateFile(
        "CONIN$",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        0, OPEN_EXISTING, 0, 0
        );

    while(1) {

        received = 0;
        ReadConsoleInput(ccin, &event, 1, &received);

        if(received && (MOUSE_EVENT==event.EventType) ) {

            if( event.Event.MouseEvent.dwEventFlags>1 ) continue;

            gotoxy(mousePos);
            printf("                   ");
            mousePos = event.Event.MouseEvent.dwMousePosition;
            gotoxy(mousePos);
            printf("%03i:%i", rand()%1000,
                event.Event.MouseEvent.dwButtonState & 0x3
                );
            }

        if(received && (KEY_EVENT == event.EventType) ) {
            if(27 == event.Event.KeyEvent.wVirtualKeyCode) break;
            }

        Sleep(50);
        }
    }
0

Dzięki ;) Teraz tylko muszę odszyfrować ten kod ;P
Mógłbyś tylko mi powiedzieć, czy dobrze przerobiłem ten kod?

#include <iostream>
#include <windows.h>

HANDLE ccout;
HANDLE ccin;

using namespace std;

inline void gotoxy(COORD pos)
{
    SetConsoleCursorPosition(ccout, pos);
}

int main()
{
    COORD mousePos = {0,0};
    INPUT_RECORD event = { FOCUS_EVENT };
    DWORD buttons, received;

    ccout = CreateFile(
        "CONOUT$",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        0, OPEN_EXISTING, 0, 0
        );
    ccin = CreateFile(
        "CONIN$",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        0, OPEN_EXISTING, 0, 0
        );

    while (true)
    {
          received = 0;
          ReadConsoleInput(ccin, &event, 1, &received);
          if (received && (MOUSE_EVENT==event.EventType) )
          {
             if ( event.Event.MouseEvent.dwEventFlags > 1 )
                continue;
             gotoxy(mousePos);
             cout << "                   ";
             mousePos = event.Event.MouseEvent.dwMousePosition;
             gotoxy(mousePos);
             cout << mousePos.X << ',' << mousePos.Y << ':' << event.Event.MouseEvent.dwButtonState;
          }
          if (received && (KEY_EVENT == event.EventType) )
          {
             if (27 == event.Event.KeyEvent.wVirtualKeyCode)
                break;
          }
          Sleep(50);
    }
    return 0;
}
0

No ba, błędów nie ma. A opis - każda funkcja jest opisana w MSDN, dojdziesz bez problemu, choćby eksperymentalnie, mając poglądowy kod (mi się po prostu linijka po linijce nie chce tłumaczyć ;) )

0

Ok, dzięki jeszcze raz, teraz będzie z górki ;)

0
Ranides napisał(a)
    ccout = CreateFile(
        "CONOUT$",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        0, OPEN_EXISTING, 0, 0
        );
    ccin = CreateFile(
        "CONIN$",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        0, OPEN_EXISTING, 0, 0
        );
ccin = GetStdHandle(STD_INPUT_HANDLE);
ccout = GetStdHandle(STD_OUTPUT_HANDLE);

Nie prościej? ;)

0

Prościej, ale źle :P STD_HANDLE można przekierować, $CONOUT zawsze wskazuje na okno konsoli. Po wywołaniu
moj_program > file.txt
twoja wersja próbowała by wyświetlać myszę w pliku ;)

dopisane:
Noo, oczywiście mój też się wywali, bo o ile gotoxy korzysta z ekranu zawsze, to piszę na stdout za pomocą printf, zamiast cprintf (który daje na ekran). Ale nie chciałem w przykładzie cprintf'a używać, bo on nie w każdym kompilatorze od razu jest, i czasem trzeba go samodzielnie importować z msvcrt

1 użytkowników online, w tym zalogowanych: 0, gości: 1