반응형

 

 

 

 

필자의 글중 ' 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], 00); // 좌표에 맞게 왼쪽버튼 누르기
                    Sleep(1);
                }
                else if(x[n] == 6000// 왼쪽버튼 떼지는 것을 6000이라고 가정
                {
                    mouse_event(MOUSEEVENTF_LEFTUP, sub_x[n], sub_y[n], 00);  // 좌표에 맞게 왼쪽버튼 떼기
                    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


반응형