필자의 글중 ' Console 범위 밖으로의 마우스 제어 ' 라는 내용을 보신 분이라면
(http://programbasic.tistory.com/entry/Console-범위-밖으로의-마우스-제어 참조)
한번쯤은 혹시 매크로 기능도 이 소스코드를 이용해서 만들 수 있지 않을까?? 라고 생각해 볼 수 있을 것이다.
이번 프로그래밍을 하면서 필자도 정말 우연찮게 알아낸 함수가 있다.
SetCursorPos 함수는 위의 링크를 따라가면 프로그램이 직접 마우스를 이동시켜주는 역할을 하는 함수이다.
필자는 이렇게 생각했다.
'그렇다면 내가 마우스 입력을 주는 신호를 저장해 주는 함수는 없을까?'
그래서 CursorPos에서 그냥 Get를 앞에 적어 보았더니 함수가 존재하였다는 것이다.
GetCursorPos함수가 바로 그 함수 였던 것이다. 필자도 결론적으로는 이 프로그램은 구상만 해봤지,
우연의 일치로 만들어진 프로그램이라 해도 과언이 아니다.
이 프로그램을 제작하면서 또 한가지 특이한 코딩중 하나는
초기화 할때 -858993460 (쓰레기 값) 을 이용했다는 것이다.
쓰레기값을 이용하지 않는다면 다음과 같은 오류가 생길 수도 있다.
모든 정수값은 모니터에서 좌표점으로 받아들여지는데 만약 초기화를 0이나 다른 특정 값으로 하면
0이라는 좌표에 마우스가 갈 수도 있고, 다른 특정 값으로 좌표가 지정될 수도 있으니
결국 매크로를 만들때는 초기화시 쓰레기 값을 이용하였다.
그외 코딩기법은 필자의 컨셉이 있듯이 대부분 이전 코딩법과 비슷하다.
****
이 소스코드를 잘 활용하는법 및 주의사항으로써는
1. Sleep함수의 값을 조절하여 매크로 속도를 자신이 이용하는 곳에 맞게 조절할 수 있다.
(소스코드를 조작하여 Sleep값을 프로그램 내에서 조작 할 수도 있다.)
2. 50000프레임을 제한으로 하고 있기에 매크로를 너무 크게 만들지 말자는 것이다.
(필자는 대학생이다 보니 수강신청에 이용 할 수 있을까 궁금할 뿐이다. 아직 이용해 보진 않았다.)
3. 매크로는 마우스 왼쪽클릭과 이동만 가능하다.
4. GetKeyState를 이용하면 프로그램을 창내려두기 해 두어도 키들이 다 먹히는 효과가 있다.
(getch()함수와 다르다는 것을 알아두자.)
****
다음은 매크로 프로그램을 이용한 동영상이다.
소스코드는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 | #include <windows.h> #include <stdio.h> void gotoxy(int x, int y) // 좌표 보내기 gotoxy { COORD Cur; Cur.X=x; Cur.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur); } void cursor(int n) // 커서 보이기 & 숨기기 { HANDLE hConsole; CONSOLE_CURSOR_INFO ConsoleCursor; hConsole = GetStdHandle(STD_OUTPUT_HANDLE); ConsoleCursor.bVisible = n; ConsoleCursor.dwSize = 1; SetConsoleCursorInfo(hConsole , &ConsoleCursor); } int main(void) { POINT pt; // 마우스 포인터 int x[50000]; // 매크로 x좌표 int y[50000]; // 매크로 y좌표 int sub_x[50000], sub_y[50000]; // 보조 xy int check_mouse = 2; // 마우스 관련 변수 int i = 0; // 매크로 녹화시 이용 int n = 0; // 메크로 진행시 이용 system("mode con: cols=31 lines=13"); // 화면 고정 cursor(0); // 커서 숨기기 gotoxy(0,0); puts("┏━━━━━━━━━━━━━┓"); // puts함수는 자동으로 줄바꿈 처리를 한다. puts("┃ ┃"); puts("┃ Mouse Macro ┃"); puts("┃ ┃"); puts("┃ F5 : 매크로 녹화 ┃"); puts("┃ F6 : 매크로 추가녹화 ┃"); puts("┃ F7 : 매크로 정지 ┃"); puts("┃ F8 : 매크로 시작 ┃"); puts("┃ F10 : 종료하기 ┃"); puts("┃ F11 : 상세 도움말 ┃"); puts("┃ ┃"); puts("┗━━━━━━━━━━━━━┛"); while(1) { if(GetKeyState(VK_F10) < 0) // F10키 누르면 { return 0; // 프로그램 종료 } else if(GetKeyState(VK_F11) < 0 ) // F11키 누르면 { gotoxy(0,0); puts("┏━━━━━━━━━━━━━┓"); puts("┃ F5 : 매크로 녹화 ┃"); puts("┃ >>처음부터 녹화를 시작 ┃"); puts("┃ F6 : 매크로 추가녹화 ┃"); puts("┃ >>계속 이어서 녹화 ┃"); puts("┃ ┃"); puts("┃ 녹화 뒤 매크로 정지 후 ┃"); puts("┃ 매크로 시작을 누르면 ┃"); puts("┃ 매크로가 진행됩니다. ┃"); puts("┃ (마우스 매크로만 가능) ┃"); puts("┃ Esc : 돌아가기 ┃"); puts("┗━━━━━━━━━━━━━┛"); while(1) { if(GetKeyState(27) < 0) // Esc키 누르면 { gotoxy(0,0); puts("┏━━━━━━━━━━━━━┓"); puts("┃ ┃"); puts("┃ Mouse Macro ┃"); puts("┃ ┃"); puts("┃ F5 : 매크로 녹화 ┃"); puts("┃ F6 : 매크로 추가녹화 ┃"); puts("┃ F7 : 매크로 정지 ┃"); puts("┃ F8 : 매크로 시작 ┃"); puts("┃ F10 : 종료하기 ┃"); puts("┃ F11 : 상세 도움말 ┃"); puts("┃ ┃"); puts("┗━━━━━━━━━━━━━┛"); break; // while문 탈출 } } } else if(GetKeyState(VK_F5) < 0 ) // 처음부터 다시 매크로 설정 { for(i = 0 ; i <= 50000 ; i ++) { x[i] = -858993460; y[i] = -858993460; // 초기화 과정 sub_x[i] = -858993460; sub_y[i] = -858993460; // 이때 모든 값은 모니터 해상도에 따라 마우스 좌표값이 // 될 수 있어서 쓰레기값인 -858993460을 이용했다. // 추천하는 방법은 아니다. } i = 0; while(1) { GetCursorPos(&pt); // 마우스 좌표값들 받아옴 x[i] = pt.x; // x좌표값 저장 y[i] = pt.y; // y좌표값 저장 sub_x[i] = 0, sub_y[i] = 0; // 왼쪽버튼 누르고 떼는 모습 저장하는 곳 i++; // i는 프레임을 의미 Sleep(10); // 0.01초 마다 1프레임 찍힘 if(GetKeyState(VK_LBUTTON) < 0 && check_mouse >= 1) // 왼쪽버튼 눌렀을 때 { sub_x[i] = x[i-1]; sub_y[i] = y[i-1]; x[i] = 5000; y[i] = 5000; check_mouse = 0; i++; } else if(GetKeyState(VK_LBUTTON) >= 0 && check_mouse == 0) // 왼쪽버튼 뗄 때 { sub_x[i] = x[i-1]; sub_y[i] = y[i-1]; x[i] = 6000; y[i] = 6000; check_mouse = 1; i++; } if(GetKeyState(VK_F7) < 0 ) { break; } if(GetKeyState(VK_F10) < 0 ) { return 0; } } } else if(GetKeyState(VK_F6) < 0 ) // 이어서 매크로 설정 { while(1) { GetCursorPos(&pt); x[i] = pt.x; y[i] = pt.y; sub_x[i] = 0, sub_y[i] = 0; i++; Sleep(10); if(GetKeyState(VK_LBUTTON) < 0 && check_mouse >= 1) // 왼쪽버튼 눌렀을 때 { sub_x[i] = x[i-1]; sub_y[i] = y[i-1]; x[i] = 5000; y[i] = 5000; check_mouse = 0; i++; } else if(GetKeyState(VK_LBUTTON) >= 0 && check_mouse == 0) // 왼쪽버튼 뗄 때 { sub_x[i] = x[i-1]; sub_y[i] = y[i-1]; x[i] = 6000; y[i] = 6000; check_mouse = 1; i++; } if(GetKeyState(VK_F7) < 0 ) { break; } if(GetKeyState(VK_F10) < 0 ) { return 0; } } } else if(GetKeyState(VK_F8) < 0 ) // 매크로 재생 { n = 0; // 프레임 처음으로 돌아가서 재생하기 위한 n while(1) { if(x[n] == 5000) // 왼쪽버튼 눌러지는 것을 5000이라고 가정 { mouse_event(MOUSEEVENTF_LEFTDOWN, sub_x[n], sub_y[n], 0, 0); // 좌표에 맞게 왼쪽버튼 누르기 Sleep(1); } else if(x[n] == 6000) // 왼쪽버튼 떼지는 것을 6000이라고 가정 { mouse_event(MOUSEEVENTF_LEFTUP, sub_x[n], sub_y[n], 0, 0); // 좌표에 맞게 왼쪽버튼 떼기 Sleep(1); } if(x[n] == -858993460) // 쓰레기값 만나면 처리되는 작동 { n = 0; // 즉, 매크로의 끝부분으로 가면 다시 n = 0 으로 하여 다시 처음부터 시작 } SetCursorPos(x[n],y[n]); // 지정한 곳의 좌표로 마우스 이동 Sleep(10); n++; if(GetKeyState(VK_F7) < 0 ) { break; } if(GetKeyState(VK_F10) < 0 ) { return 0; } } } Sleep(10); } return 0; } | Crocus |
'Basic > C++' 카테고리의 다른 글
c++ 입력 및 출력, bool타입, 레퍼런스 (0) | 2015.03.07 |
---|---|
MIDI 함수를 이용한 Console에서 피아노 연주 - (3) July - My Soul (0) | 2014.09.06 |
커서 숨기기 (0) | 2014.03.06 |
MIDI 함수를 이용한 Console에서 피아노 연주 - (5) 연주 및 응용 (0) | 2014.02.14 |
MIDI 함수를 이용한 Console에서 피아노 연주 - (4) 다양한 악기 (0) | 2014.02.03 |