티스토리 뷰

[원글 - 2011년 이글루스 블로그]

우연히 시작한 실험이라... 이 실험이 얼마나 지속될지는 장담할 수 없다 ㅋ

마우스를 움직이는 방법은 크게 2가지가 있다


user32.dll의 mouse_event()를 이용하거나 (지금은 SendInput()을 권장한다)

API함수인 SetCursorPos()를 이용하는 방법이 있다

두 함수의 차이점이 궁금해서 구글링을 해보았지만...

명확한 답을 얻지는 못했다

다만 누군가 추측으로 마우스 입력 스트림에 이벤트 발생여부가 아닐까 라고 적어놓았다

SetCursorPos()은 단순히 커서를 이동하는 것이고,

mouse_event() (또는 SendInput())의 경우에는 입력 스트림에 이벤트를 발생시킨다는 것이다

예로, 게임 같은 lower level mouse event를 listen하는 프로그램에서는 인지를 못할 것이다!!

라고 적어놓아서 갑자기 정말 그런지 궁금해져서 이 실험을 시작한다

======================================================================================

1. 실험 방법

게임이 실행되는 PC에 서버 프로그램을 깔아놓았다

서버 프로그램은 별 기능은 없고, 

날아오는 패킷에 맞추어 마우스를 위, 아래, 왼쪽, 오른쪽으로 움직이게 한다

이 때, mouse_event() 또는 SetCursorPos() 함수를 각각 사용하여 그 결과를 관찰하였다

1차 실험대상은 일반적인 윈도우 어플리케이션

마우스 무브 이벤트가 제대로 작동하는지를 테스트했다

2차 실험대상은 콜 오브 듀티 : 모던 워페어2

메뉴 선택화면의 커서 이동과 게임 중의 시점 이동이 제대로 되는지 테스트했다

2. 실험 결과

클라이언트 PC에서 키보드 방향키를 누르면 패킷이 날라가도록 하였다

>1차 실험대상 - 윈도우 어플리케이션

윈도우 어플리케이션 상에서 두 함수 모두 정상적으로 마우스 MOVE 메시지를 발생하였다

GetCursorPos()이 아닌 메시지 상의 마우스 좌표를 수신하여 화면에 출력했는데

모두 정상적인 좌표를 출력하였다

다만, mouse_event()의 경우 절대 좌표를 사용할경우 0~65535 mickey좌표를 사용하기 때문에

변환을 해주어야 하는데, 정확한 화면 좌표에 맵핑은 매우 어려웠다.

상대 좌표로 이동할 때도 마찬가지... 10만큼 이동하고 싶다고 정확히 10만큼 이동되는 것은 아니었다

(이건... SendInput()을 써도 마찬가지)

좌표의 정확성 면에서는 SetCursorPos()을 쓰는게 좋겠다

>2차 실험대상 - 콜 오브 듀티 - 모던 워페어2

첫 번째는 타이틀 화면에서 마우스 커서 움직이기...

이 경우는 커서의 위치를 실시간으로 따와서 그려준다고 생각했기에

두 함수 모두 동작할 것이라고 판단하였다

과연... 두 함수 모두 움직이는 것을 확인할 수 있었다

다음은 게임 중에 시점 변환하기...

이 경우는 게임에서 마우스 로우 레벨 인풋을 감지할 수 있기 때문에 

많은 기대는 하지 않았다...

그런데 결과는 의외였다... 

두 함수 모두 정상적으로 작동하는 것...

키보드에 맞추어 시점이 척척 회전하는 것을 볼 수 있었다!!

3. 속도 테스트

디버그 모드에서 (즉, 최적화 옵션 모두 끄고!!!)

각각 절대좌표 0, 0으로 이동한다

for문을 이용하여 5만번 호출하고, 시간을 측정하였다

SetCursorPos()의 경우에는 약 350~400ms를 왔다갔다하였다

의외인 것은 mouse_event()함수 였는데...

670~720ms를 왔다갔다하였다

==================================================================================

결론

1차 실험에서는 SetCursorPos()와 mouse_event()로 마우스 움직이기의 차이점을 찾지 못했다;;

다만 정확한 스크린 좌표 맵핑은 SetCursorPos()을 이용하는 것이 좋다라는 결론만 나왔다...

시간에 있어서도 SetCursorPos()이 의외로 압승을 거두면서...

mouse_event()만의 장점이 발견되지 않는 이상...

앞으로 마우스 이동에 관한한은... SetCursorPos()을 사용할 것 같다 -ㅂ-;;

이상 1차 실험 종료!!

2차는 없을지도~


댓글
최근에 올라온 글
Total
Today
Yesterday
최근에 달린 댓글
«   2024/05   »
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