오늘 포스팅할 내용은 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개를 같이 쓰면 마우스 클릭이 됩니다.
2. 마우스 위치 제어
Cursor.Position = new Point(X, Y);
코드를 구현하여 마우스 제어가 제대로 되는지 확인해보도록 하겠습니다.
소스 코드
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(318, 608); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); Tick = 0; } } } } |
이 코드가 어떤 동작을 하는지 살펴보겠습니다.
Start를 클릭하면 박스 안에 타이머가 100ms 간격으로 마우스 좌표를 표시해주고, 5초가 되면 해당 좌표(318, 608)로 이동을 하여 마우스를 클릭해주고 취소를 누르면 타이머를 멈추는 코드입니다. 키보드 제어도 이와 비슷한 방식으로 하면 되니 어렵지 않습니다.
2019/04/15 - [프로그래밍/C#] - C#을 이용한 시리얼 통신(포트 검색/연결/해제)
2019/04/08 - [프로그래밍/C#] - [Zedgraph] C# 그래프 라이브러리를 이용한 실시간 그래프
2019/06/20 - [프로그래밍] - Arabic 프로그래밍 규칙
'프로그래밍 > C#' 카테고리의 다른 글
C# USB 통신, LibUsbDotNet (0) | 2020.08.27 |
---|---|
C# 시리얼 통신 아스키 외 값 읽기 (8) | 2020.08.17 |
C# 유튜브 동영상 다운로더 만들기(MP3, MP4) (1) | 2020.06.22 |
C#을 이용한 시리얼 통신(포트 검색/연결/해제) (12) | 2019.04.15 |
[Zedgraph] C# 그래프 라이브러리를 이용한 실시간 그래프 (5) | 2019.04.08 |