[C언어-기초실습-14] 마우스의 현재 위치를 구하시오
[C언어-기초실습-14] 마우스의 현재 위치를 구하시오
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php
오늘 실험 내용은 콘솔창에서 마우스위 위치 정보를 구하는 문제입니다. ReadConsoleInput()함수를 통해 콘솔창에 정보를 읽어오는데 여기서 읽어 온 정보 중 마우스 이벤트 정보를 이용하여 현재 마우스의 위치를 알아보도록 하겠습니다.
1. 문제의 이해
- 참조 : INPUT_RECORD structure
docs.microsoft.com 에서 제공되는 레퍼런스 정보입니다.
마우스 이벤트를 사용하기 위해서는 위 참조 사이트에 가시면 INPUT_RECORD에 대해 알아야 합니다.
typedef struct _INPUT_RECORD {
WORD EventType;
union {
KEY_EVENT_RECORD KeyEvent;
MOUSE_EVENT_RECORD MouseEvent;
WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
MENU_EVENT_RECORD MenuEvent;
FOCUS_EVENT_RECORD FocusEvent;
} Event;
} INPUT_RECORD;
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition;
DWORD dwButtonState;
DWORD dwControlKeyState;
DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;
보시면 다양한 이벤트 정보를 관리하는데 여기서 실습에 필요 한 정보는 마우스 이벤트 정보이겠죠. 자세한 내용은 위 참조 사이트에 가셔서 한번 읽어보시기 바랍니다.
콘솔창에서 정보를 읽기
INPUT_RECORD rc;
DWORD dw;
ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &rc, 1, &dw);
ReadConsoleInput(입력버퍼핸들,읽어올정보,사이즈,읽을레코드수)로 구성되어 있습니다. INPUT_RECORD 인 rc 객체 변수에 입력핸들정보가 저장됩니다.
이 rc객체 변수안에 들어 있는 마우스정보를 통해 마우스 이벤트를 실행하면 됩니다.
마우스 위치값 얻기
X = rc.Event.MouseEvent.dwMousePosition.X
Y = rc.Event.MouseEvent.dwMousePosition.Y
INPUT_RECORD인 rc안에 위 코딩으로 마우스의 위치 정보를 좌표(X,Y)정보를 얻게 됩니다.
이 정보를 화면에 특정 위치에 출력하기
COORD pos={0,0}; //0,0의 위치
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
printf("%d, %d\n", mouse_XY[0], mouse_XY[1]);
SetConsoleCursorPosition() 함수는 콘솔창에 커서의 위치를 이동시키는 함수입니다. 여기서 콘솔창으로 반대로 출력이니깐 GetStdHandle(STD_OUTPUT_HANDLE)함수에서 출력핸들를 사용 하겠죠. pos인자는 해당 콘솔창의 고정 좌표로 커서가 위치하게 됩니다. 이렇게 하면 커서가 특정 위치로 이동하고 그 위치를 기준으로 printf()함수 안에 정보가 출력되게 됩니다.
코딩
간단히 마우스 위치 정보만 추출하여 콘솔창에 출력하는 실습을 해보죠.
[전체소스]
#include<Windows.h>
#include<stdio.h>
int main(int argc, char *argv[]){
INPUT_RECORD rc;
DWORD dw;
int mouse_XY[2];
COORD pos={0,0};
SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
while(1){
ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &rc, 1, &dw); //핸들정보
mouse_XY[0] = rc.Event.MouseEvent.dwMousePosition.X; //X좌표
mouse_XY[1] = rc.Event.MouseEvent.dwMousePosition.Y; //Y좌표
FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ', 100 , pos, &dw); //화면 지우기
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); //콘솔좌표이동
printf("%d, %d\n", mouse_XY[0], mouse_XY[1]);
}
return 0;
}
무한 루프로 while(1)문을 사용했기 때문에 정상적인 종료를 이루어 지지 않습니다. 그냥 콘솔창의 우측 상단에 강제 종료 버턴을 눌러서 제거해야 합니다.
[결과]
마무리
마우스 이벤트에 대해 저 자세히 배우거나 또는 키보드 이벤트와 같은 다른 이벤트에 대해서 알고자 한다면 위에 참조 링크된 사이트에 가시면 레퍼런스 문서를 한번 읽어보시기 바랍니다. 그리고 글 중간에 예제가 링크 되어 있어서 예제에 가셔서 소스를 분석하시면 어느정도 다양한 이벤트 실습을 할 수 있을 거에요.
