마우스 클릭 코딩 - mauseu keullig koding

이벤트 타입

웹브라우저는 마우스와 관련해서 다양한 이벤트 타입을 지원한다.

  • click
    클릭했을 때 발생하는 이벤트. 
  • dblclick
    더블클릭을 했을 때 발생하는 이벤트
  • mousedown
    마우스를 누를 때 발생
  • mouseup
    마우스버튼을 땔 때 발생
  • mousemove
    마우스를 움직일 때
  • mouseover
    마우스가 엘리먼트에 진입할 때 발생
  • mouseout
    마우스가 엘리먼트에서 빠져나갈 때 발생
  • contextmenu
    컨텍스트 메뉴가 실행될 때 발생

키보드 조합

마우스 이벤트가 호출될 때 특수키(alt, ctrl, shift)가 눌려진 상태를 감지해야 한다면 이벤트 객체의 프로퍼티를 사용한다. 이 때 사용하는 프로퍼티는 아래와 같다.

  • event.shiftKey
  • event.altKey
  • event.ctrlKey

마우스 포인터 위치

마우스 이벤트와 관련한 작업에서는 마우스 포인터의 위치를 알아내는 것이 중요할 때가 있는데 이런 경우 이벤트 객체의 clientX와 clientY를 사용한다.

예제

아래 예제는 지금까지 살펴본 이벤트와 관련된 기능을 종합적으로 보여준다. (실행)

<html>
    <head>
		<style>
			body{
				background-color: black;
				color:white;
			}
			#target{
				width:200px;
				height:200px;
				background-color: green;
				margin:10px;
			}
			table{
				border-collapse: collapse;
				margin:10px;
				float: left;
				width:200px;
			}
			td, th{
				padding:10px;
				border:1px solid gray;
			}
		</style>
	</head>
	<body>
		<div id="target">

		</div>
		<table>
			<tr>
				<th>event type</th>
				<th>info</th>
			</tr>
			<tr>
				<td>click</td>
				<td id="elmclick"></td>
			</tr>	
			<tr>
				<td>dblclick</td>
				<td id="elmdblclick"></td>
			</tr>
			<tr>
				<td>mousedown</td>
				<td id="elmmousedown"></td>
			</tr>			
			<tr>
				<td>mouseup</td>
				<td id="elmmouseup"></td>
			</tr>			
			<tr>
				<td>mousemove</td>
				<td id="elmmousemove"></td>
			</tr>			
			<tr>
				<td>mouseover</td>
				<td id="elmmouseover"></td>
			</tr>			
			<tr>
				<td>mouseout</td>
				<td id="elmmouseout"></td>
			</tr>
			<tr>
				<td>contextmenu</td>
				<td id="elmcontextmenu"></td>
			</tr>			
		</table>
		<table>
			<tr>
				<th>key</th>
				<th>info</th>
			</tr>
			<tr>
				<td>event.altKey</td>
				<td id="elmaltkey"></td>
			</tr>
			<tr>
				<td>event.ctrlKey</td>
				<td id="elmctrlkey"></td>
			</tr>
			<tr>
				<td>event.shiftKey</td>
				<td id="elmshiftKey"></td>
			</tr>
		</table>
		<table>
			<tr>
				<th>position</th>
				<th>info</th>
			</tr>
			<tr>
				<td>event.clientX</td>
				<td id="elemclientx"></td>
			</tr>
			<tr>
				<td>event.clientY</td>
				<td id="elemclienty"></td>
			</tr>
		</table>
		<script>
		var t = document.getElementById('target');
		function handler(event){
			var info = document.getElementById('elm'+event.type);
			var time = new Date();
			var timestr = time.getMilliseconds();
			info.innerHTML = (timestr);
			if(event.altKey){
				document.getElementById('elmaltkey').innerHTML = timestr;
			}
			if(event.ctrlKey){
				document.getElementById('elmctrlkey').innerHTML = timestr;
			}
			if(event.shiftKey){
				document.getElementById('elmshiftKey').innerHTML = timestr;
			}
			document.getElementById('elemclientx').innerHTML = event.clientX;
			document.getElementById('elemclienty').innerHTML = event.clientY;
		}
		t.addEventListener('click', handler);
		t.addEventListener('dblclick', handler);
		t.addEventListener('mousedown', handler);
		t.addEventListener('mouseup', handler);
		t.addEventListener('mousemove', handler);
		t.addEventListener('mouseover', handler);
		t.addEventListener('mouseout', handler);
		t.addEventListener('contextmenu', handler);
		</script>
	</body>
</html>

오늘은 기본 문법은 아니고 그냥 다른 일을 진행하다가 알게 된 모듈에 대해 적어 보려한다.

원래 캡처프로그램을 만들려고 알아보다가 알게 된 것인데, 마우스 클릭 시 클릭 했을 때의 좌표를 저장하는 것이다.

바로 pynput이라는 라이브러리를 통해 마우스를 제어하는 것인데, 해당 관련 자세한 사항은 아래 웹사이트에서 확인 가능하다.

Handling the mouse — pynput 1.7.6 documentation

Parameters: on_move (callable) – The callback to call when mouse move events occur. It will be called with the arguments (x, y), which is the new pointer position. If this callback raises StopException or returns False, the listener is stopped. on_click

pynput.readthedocs.io

마우스 클릭 시 좌표를 알아내는 코드는 아래와 같다.

#include <stdio.h> 

#include <Windows.h>

HANDLE COUT = 0;    // 콘솔 출력 장치

HANDLE CIN = 0;        // 콘솔 입력 장치

int be_input()

{

INPUT_RECORD input_record;

DWORD input_count;

PeekConsoleInput(CIN, &input_record, 1, &input_count);

return input_count;

}

int get_input(WORD *vkey, COORD *pos)

{

INPUT_RECORD input_record;

DWORD input_count;

ReadConsoleInput(CIN, &input_record, 1, &input_count);

switch(input_record.EventType) {

case MOUSE_EVENT:

if(pos && (input_record.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)) {

CONSOLE_SCREEN_BUFFER_INFO csbi;

GetConsoleScreenBufferInfo(COUT,&csbi);

*pos = input_record.Event.MouseEvent.dwMousePosition;

pos->-= csbi.srWindow.Left;

pos->-= csbi.srWindow.Top;

return MOUSE_EVENT;

}

break;

}

//    FlushConsoleInputBuffer(CIN);

return 0;

}

void gotoxy(int x, int y)      // 좌표 보내기 gotoxy

{

COORD Cur;

Cur.X=x;

Cur.Y=y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur);

}

void main()

{

DWORD mode;

WORD key;

COORD pos;

int event;        // 마우스 이벤트에 이용

int x;            // 마우스의 x좌표 저장소

int y;            // 마우스의 y좌표 저장소

CIN = GetStdHandle(STD_INPUT_HANDLE);

COUT = GetStdHandle(STD_OUTPUT_HANDLE);

// 마우스 활성화

GetConsoleMode(CIN,&mode);

SetConsoleMode(CIN, mode | ENABLE_MOUSE_INPUT);

while(1)

{

if(be_input()) 

{    

if(get_input(&key,&pos) != 0 )        

{            

MOUSE_EVENT;    

= pos.X;    // 마우스클릭값이 x,y변수에 저장되도록함

= pos.Y;

gotoxy(x,y);

printf("*");

}

}

}

}