본문으로 바로가기

C# 마우스 제어(클릭, 좌표 이동)

category 프로그래밍/C# 2019. 8. 25. 14:25
반응형

오늘 포스팅할 내용은 C#을 이용한 마우스 제어입니다. 이를 이용해 간단한 마우스 매크로를 만들 수 있습니다. 아래 URL을 들어가서 보면 mouse_event function에 대해서 볼 수 있습니다.


Mouse_event function URL

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event


마우스 Event를 사용하기 위해서는 네임스페이스와 DLL이 추가를 해야 합니다. 아래와 같이 네임스페이스에는 System.Runtime.InteropServices 그리고 DLL은 user32.dll을 추가해줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices; 
 
namespace WindowsFormsApp1
{
    public partial class AutoClick : Form
    {
 
        [DllImport("user32.dll")]



이제 mouse_event 사용방법에 대해서 알아야 합니다.


1
2
3
4
5
6
7
void mouse_event(
  DWORD     dwFlags,
  DWORD     dx,
  DWORD     dy,
  DWORD     dwData,
  ULONG_PTR dwExtraInfo
);



dwFlags는 마우스의 다양한 동작들을 제어를 할 수 있게 해줍니다. 그중에 왼쪽 마우스 버튼 누름/떼어짐을 이용해서 특정 시간이 되면 좌표로 이동을 하여 클릭을 하는 프로그램을 만들어보겠습니다. 누름/떼어짐은 dwFlags에 아래의 값을 넣으면 됩니다.


왼쪽 마우스 버튼 눌름 : MOUSEEVENTF_LEFTDOWN = 0x0002;

왼쪽 마우스 버튼 떼어짐 : MOUSEEVENTF_LEFTUP = 0x0004;

 

예를 들어 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)는 왼쪽 마우스 버튼 누름이 되고 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)은 왼쪽 마우스 버튼 떼어짐이 되어 2개를 같이 쓰면 마우스 클릭이 됩니다.


좌표 이동을 해야 하는데 dx, dy 값이 사용해보니 모니터의 해상도에 영향을 받는 것으로 보입니다. 그래서 저는 Cursor.Position Property를 이용해 해상도에 관계없이 커서의 위치 제어 및 값을 가져왔습니다. 사용방법은 아래와 같습니다.

1. 마우스 좌표 값 읽기
Cursor.Position.X.ToString();
Cursor.Position.Y.ToString();


2. 마우스 위치 제어

Cursor.Position = new Point(X, Y);


네임스페이스 : System.Windows.Forms;


코드를 구현하여 마우스 제어가 제대로 되는지 확인해보도록 하겠습니다.




소스 코드


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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices; 
 
namespace WindowsFormsApp1
{
    public partial class AutoClick : Form
    {
        int Tick = 0;
 
        [DllImport("user32.dll")]
        static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);
 
        private const uint MOUSEEVENTF_LEFTDOWN = 0x0002;      // The left button is down.
        private const uint MOUSEEVENTF_LEFTUP = 0x0004;        // The left button is up.
 
        public AutoClick()
        {
            InitializeComponent();
        }
 
        private void XaxisTEXT_TextChanged(object sender, EventArgs e)
        {
 
        }
 
        private void YaxisTEXT_TextChanged(object sender, EventArgs e)
        {
 
        }
 
        private void Start_btn_Click(object sender, EventArgs e)
        {
            //타이머 시작
            Timer.Enabled = true;
        }
 
        private void Cancel_btn_Click(object sender, EventArgs e)
        {
            //타이머 시작
            Timer.Enabled = false;
        }
 
        private void Timer_Tick(object sender, EventArgs e)
        {
 
            XaxisTEXT.Text = Cursor.Position.X.ToString();
            YaxisTEXT.Text = Cursor.Position.Y.ToString();
 
            Tick++;
 
            if (Tick == 50)
            {
                Cursor.Position = new Point(318608);
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0000);
                mouse_event(MOUSEEVENTF_LEFTUP, 0000);
                Tick = 0;
            }
           
        }
    }
}


이 코드가 어떤 동작을 하는지 살펴보겠습니다.


Start를 클릭하면 박스 안에 타이머가 100ms 간격으로 마우스 좌표를 표시해주고, 5초가 되면 해당 좌표(318, 608)로 이동을 하여 마우스를 클릭해주고 취소를 누르면 타이머를 멈추는 코드입니다. 키보드 제어도 이와 비슷한 방식으로 하면 되니 어렵지 않습니다.



2019/04/15 - [프로그래밍/C#] - C#을 이용한 시리얼 통신(포트 검색/연결/해제)

2019/04/08 - [프로그래밍/C#] - [Zedgraph] C# 그래프 라이브러리를 이용한 실시간 그래프

2019/06/20 - [프로그래밍] - Arabic 프로그래밍 규칙

2019/06/09 - [프로그래밍] - 소스 코드 주석 다는 법

2019/06/06 - [프로그래밍] - UTF8 구조 및 유니코드 변환 소스 코드

반응형