Obsługa myszki w konsoli Windows

Odpowiedz Nowy wątek
2009-01-23 20:00
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 ;)


Pozostało 580 znaków

2009-01-23 23:18
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);
        }
    }

Pozostało 580 znaków

2009-01-24 17:02
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;
}

Pozostało 580 znaków

2009-01-24 22:00
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ć ;) )

Pozostało 580 znaków

2009-01-24 23:23
0

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


Pozostało 580 znaków

2009-01-31 00:04
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? ;)


homepage
<font size="1">Jeśli starasz się, by Twój system był idiotoodporny, zawsze znajdzie się idiota, który jest bardziej pomysłowy od Ciebie.</span>

Pozostało 580 znaków

2009-01-31 03:33
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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