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 ;)
- Rejestracja:około 17 lat
- Ostatnio:około 10 lat
0

- Rejestracja:około 19 lat
- Ostatnio:ponad 9 lat
- Postów:892
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);
}
}
- Rejestracja:około 17 lat
- Ostatnio:około 10 lat
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;
}

- Rejestracja:ponad 19 lat
- Ostatnio:około rok
- Lokalizacja:Londyn
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? ;)

- Rejestracja:około 19 lat
- Ostatnio:ponad 9 lat
- Postów:892
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