c언어 마우스의 위치를 소수점단위로 구할 수 있나요?
-
게시물 수정 , 삭제는 로그인 필요
이전 질문에서 누군가가 그냥 ChatGPT로 답변해버려서
다시 질문 작성합니다
가장 아래에 올라온 소스가 제가 만든 마우스 관련 소스인데 여기서 좌클릭 유지가 같은 위치에서 꾹 누르고 있을 때를 말하는 것입니다.
쓰레드와 시간관련 함수를 사용 하지 않고 만들었습니다.(stdio.h 와 windows.h만 사용)
마우스를 꾹 누르면 입력이 한번 눌렸다가 다시 입력될 때 까지의 그 텀을 이용해서 만들었죠
추가로 마우스를 이동하면 그 즉시 값이 도출되기 때문에
마우스가 다른 좌표로 이동하지 않으면 드래그가 아닌 그 키가 유지된다고 보는걸로 해결하려 했습니다
근데 아주 살짝 움직이면 좌표가 처음 누른곳과 같은곳으로 입력이 되어버려서
드래그를 하려 해도 키다운 -> 키유지 -> 드래그 가 되어버리더군요
추가로유지하지 않아도 그냥 곧바로 살짝 움직이면 키유지가 되어버립니다
마우스를 살짝 움직여도 드래그가 되게 하고 싶은데 그러려면 마우스 좌표를 정확히 따는법이 필요한것 같아서.. 혹시 그 정확한 좌표를 따는법을 알 수 있을까요??
#include<Windows.h>
#include<stdio.h>
INPUT_RECORD rec;//?★ INPUT_RECORD 는 입력을 기억하는 자료형이다(?)
DWORD dwNOER;//★ 참고로 DWORD는 unsigned long 을 뜻한다 0~4294967295 (0 ~ 2^32-1)
void BasicSetting();//기존 main에 있던 설정들을 여기로 옮겨두었다.
void gotoxy(int x, int y);//커서위치
int CheckMouse(int* x, int* y);//마우스 위치
void remove_scrollbar();//스크롤바 삭제
void textcolor(int colorNum);//글자색
int mouse;
int x_ = 0;
int y_ = 0;
int mouse_ = 0;
//글자 색 코드
#define Black 0 // textcolor(0); Black
#define Dark_Blue 1 // textcolor(0); Dark Blue
#define Dark_Green 2 // textcolor(0); Dark Green
#define Dark_Sky_Blue 3 // textcolor(0); Dark Sky Blue
#define Dark_Red 4 // textcolor(0); Dark Red
#define Dark_Purple 5 // textcolor(0); Dark Purple
#define Dark_Yellow 6 // textcolor(0); Dark Yellow
#define Gray 7 // textcolor(0); Gray
#define Dark_Gray 8 // textcolor(0); Dark Gray
#define Blue 9 // textcolor(0); Blue
#define Green 10 // textcolor(0); Green
#define Sky_Blue 11 // textcolor(0); Sky Blue
#define Red 12 // textcolor(0); Red
#define Purple 13 // textcolor(0); Purple
#define Yellow 14 // textcolor(0); Yellow
#define White 15 // textcolor(0); White
void main()
{
mouse = 0;
int select = 0;
BasicSetting();//초기 세팅
int mousex = 0, mousey = 0;//마우스 좌표
while (1) {
int m = CheckMouse(&mousex, &mousey);
if (m == 1) {
gotoxy(0, 0);
printf("마우스 키 다운 ");
}
else if (m == 4) {
gotoxy(0, 0);
printf("마우스 드래그 ");
}
else if (m == 2) {
gotoxy(0, 0);
printf("마우스 움직임 ");
}
else if (m == 3) {
gotoxy(0, 0);
printf("키보드 타이핑 (E키를 눌렀습니다)");
}
else if (m == 0) {
gotoxy(0, 0);
printf("키보드 타이핑 ");
}
else if (m == 5) {
gotoxy(0, 0);
printf("마우스 키 업 ");
}
else if (m == 6) {
gotoxy(0, 0);
printf("마우스 키 유지 ");
}
}
}
void BasicSetting() {
textcolor(7);//Gray 색(기존 오리지널보다 살짝 밝음)
HANDLE CIN, COUT;
CIN = GetStdHandle(STD_INPUT_HANDLE);
COUT = GetStdHandle(STD_OUTPUT_HANDLE);
remove_scrollbar(); //스크롤바 삭제
//SetWindowLong(GetConsoleWindow(), GWL_STYLE, WS_CAPTION); //창스타일변경
system("mode con cols=120 lines=31");
//입력 커서 숨기기
CONSOLE_CURSOR_INFO curInfo = { 1 };
SetConsoleCursorInfo(COUT, &curInfo);
//마우스 편집 막기
DWORD prevMode;
GetConsoleMode(CIN, &prevMode);
SetConsoleMode(CIN, prevMode & ~ENABLE_QUICK_EDIT_MODE);
SetConsoleMode(COUT, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);// ?★ 마우스 입력모드로 변경
}
void gotoxy(int x, int y)
{
COORD Pos;
Pos.X = x;
Pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
int CheckMouse(int* x, int* y)
{
HANDLE CIN, COUT;
CIN = GetStdHandle(STD_INPUT_HANDLE);
COUT = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD mode;
GetConsoleMode(CIN, &mode); // 마우스 재활성화 ?★여기서 DWORD 값을 받는다
SetConsoleMode(CIN, mode | ENABLE_MOUSE_INPUT);// 마우스 재활성화
FlushConsoleInputBuffer(CIN);
ReadConsoleInput(CIN, &rec, 1, &dwNOER); // 콘솔창 입력을 받아들임.
FlushConsoleInputBuffer(CIN);
if (rec.EventType == MOUSE_EVENT) // 마우스 이벤트일 경우
{
int mouse_x = rec.Event.MouseEvent.dwMousePosition.X; // X값 받아옴
int mouse_y = rec.Event.MouseEvent.dwMousePosition.Y; // Y값 받아옴
*x = mouse_x;
*y = mouse_y;
if (rec.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) { // 좌측 버튼이 클릭되었을 경우
if (mouse != 1) {
x_ = mouse_x;//현재 위치 저장
y_ = mouse_y;//현재 위치 저장
mouse = 1;
return 1;
}
else {
if (x_ == mouse_x && y_ == mouse_y && mouse_ == 0) {
return 6;// 좌클릭 유지
}
else {
mouse_ = 1;
return 4;// 드래그
}
}
}
else {
if (mouse != 2) {
mouse = 2;
mouse_ = 0;
return 5;// 좌클릭 업
}
return 2;// 마우스 움직임
}
}
else if (rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown) {
if (rec.Event.KeyEvent.wVirtualKeyCode == 'e' || rec.Event.KeyEvent.wVirtualKeyCode == 'E') {
return 3;
}
return 0;//키보드 입력일 시
}
return 0;
}
void remove_scrollbar()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo(handle, &info);
COORD new_size =
{
info.srWindow.Right - info.srWindow.Left + 1,
info.srWindow.Bottom - info.srWindow.Top + 1
};
SetConsoleScreenBufferSize(handle, new_size);
}
void textcolor(int colorNum) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colorNum);//색을 바꾼다
}
쓰레드와 시간관련 함수를 사용 하지 않고 만들었습니다.(stdio.h 와 windows.h만 사용)
마우스를 꾹 누르면 입력이 한번 눌렸다가 다시 입력될 때 까지의 그 텀을 이용해서 만들었죠
#include<Windows.h>
#include<stdio.h>
INPUT_RECORD rec;//?★ INPUT_RECORD 는 입력을 기억하는 자료형이다(?)
DWORD dwNOER;//★ 참고로 DWORD는 unsigned long 을 뜻한다 0~4294967295 (0 ~ 2^32-1)
void BasicSetting();//기존 main에 있던 설정들을 여기로 옮겨두었다.
void gotoxy(int x, int y);//커서위치
int CheckMouse(int* x, int* y);//마우스 위치
void remove_scrollbar();//스크롤바 삭제
void textcolor(int colorNum);//글자색
int mouse;
int x_ = 0;
int y_ = 0;
int mouse_ = 0;
//글자 색 코드
#define Black 0 // textcolor(0); Black
#define Dark_Blue 1 // textcolor(0); Dark Blue
#define Dark_Green 2 // textcolor(0); Dark Green
#define Dark_Sky_Blue 3 // textcolor(0); Dark Sky Blue
#define Dark_Red 4 // textcolor(0); Dark Red
#define Dark_Purple 5 // textcolor(0); Dark Purple
#define Dark_Yellow 6 // textcolor(0); Dark Yellow
#define Gray 7 // textcolor(0); Gray
#define Dark_Gray 8 // textcolor(0); Dark Gray
#define Blue 9 // textcolor(0); Blue
#define Green 10 // textcolor(0); Green
#define Sky_Blue 11 // textcolor(0); Sky Blue
#define Red 12 // textcolor(0); Red
#define Purple 13 // textcolor(0); Purple
#define Yellow 14 // textcolor(0); Yellow
#define White 15 // textcolor(0); White
void main()
{
mouse = 0;
int select = 0;
BasicSetting();//초기 세팅
int mousex = 0, mousey = 0;//마우스 좌표
while (1) {
int m = CheckMouse(&mousex, &mousey);
if (m == 1) {
gotoxy(0, 0);
printf("마우스 키 다운 ");
}
else if (m == 4) {
gotoxy(0, 0);
printf("마우스 드래그 ");
}
else if (m == 2) {
gotoxy(0, 0);
printf("마우스 움직임 ");
}
else if (m == 3) {
gotoxy(0, 0);
printf("키보드 타이핑 (E키를 눌렀습니다)");
}
else if (m == 0) {
gotoxy(0, 0);
printf("키보드 타이핑 ");
}
else if (m == 5) {
gotoxy(0, 0);
printf("마우스 키 업 ");
}
else if (m == 6) {
gotoxy(0, 0);
printf("마우스 키 유지 ");
}
}
}
void BasicSetting() {
textcolor(7);//Gray 색(기존 오리지널보다 살짝 밝음)
HANDLE CIN, COUT;
CIN = GetStdHandle(STD_INPUT_HANDLE);
COUT = GetStdHandle(STD_OUTPUT_HANDLE);
remove_scrollbar(); //스크롤바 삭제
//SetWindowLong(GetConsoleWindow(), GWL_STYLE, WS_CAPTION); //창스타일변경
system("mode con cols=120 lines=31");
//입력 커서 숨기기
CONSOLE_CURSOR_INFO curInfo = { 1 };
SetConsoleCursorInfo(COUT, &curInfo);
//마우스 편집 막기
DWORD prevMode;
GetConsoleMode(CIN, &prevMode);
SetConsoleMode(CIN, prevMode & ~ENABLE_QUICK_EDIT_MODE);
SetConsoleMode(COUT, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);// ?★ 마우스 입력모드로 변경
}
void gotoxy(int x, int y)
{
COORD Pos;
Pos.X = x;
Pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
int CheckMouse(int* x, int* y)
{
HANDLE CIN, COUT;
CIN = GetStdHandle(STD_INPUT_HANDLE);
COUT = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD mode;
GetConsoleMode(CIN, &mode); // 마우스 재활성화 ?★여기서 DWORD 값을 받는다
SetConsoleMode(CIN, mode | ENABLE_MOUSE_INPUT);// 마우스 재활성화
FlushConsoleInputBuffer(CIN);
ReadConsoleInput(CIN, &rec, 1, &dwNOER); // 콘솔창 입력을 받아들임.
FlushConsoleInputBuffer(CIN);
if (rec.EventType == MOUSE_EVENT) // 마우스 이벤트일 경우
{
int mouse_x = rec.Event.MouseEvent.dwMousePosition.X; // X값 받아옴
int mouse_y = rec.Event.MouseEvent.dwMousePosition.Y; // Y값 받아옴
*x = mouse_x;
*y = mouse_y;
if (rec.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) { // 좌측 버튼이 클릭되었을 경우
if (mouse != 1) {
x_ = mouse_x;//현재 위치 저장
y_ = mouse_y;//현재 위치 저장
mouse = 1;
return 1;
}
else {
if (x_ == mouse_x && y_ == mouse_y && mouse_ == 0) {
return 6;// 좌클릭 유지
}
else {
mouse_ = 1;
return 4;// 드래그
}
}
}
else {
if (mouse != 2) {
mouse = 2;
mouse_ = 0;
return 5;// 좌클릭 업
}
return 2;// 마우스 움직임
}
}
else if (rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown) {
if (rec.Event.KeyEvent.wVirtualKeyCode == 'e' || rec.Event.KeyEvent.wVirtualKeyCode == 'E') {
return 3;
}
return 0;//키보드 입력일 시
}
return 0;
}
void remove_scrollbar()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo(handle, &info);
COORD new_size =
{
info.srWindow.Right - info.srWindow.Left + 1,
info.srWindow.Bottom - info.srWindow.Top + 1
};
SetConsoleScreenBufferSize(handle, new_size);
}
void textcolor(int colorNum) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colorNum);//색을 바꾼다
}