2013년 11월 10일 일요일

[C#] API를 이용한 마우스 제어

들어가며


저는 이 내용을 제가 만든 클래스를 바탕으로 소개하려고 합니다.

API 함수 중에서 mouse_event 라는 함수를 이용하여 만든 것입니다.

정확한 내용을 원하시면 MSDN 에 글이 있으니 읽어보시기를 바랍니다.

※주의 : 마우스 제어를 위한 모든 기능이 갖춰져 있는 것은 아닙니다.

※2013-11-16일 수정

※2016-10-15일 수정
WindowsForm의 기능을 이용하여 수정한 클래스와
WPF에서의 예제 추가


1. enum MouseEventFlag

이 열거체는 mouse_event 함수에 사용하는 매크로들을 모아둔 것입니다.

이름을 보면 대부분 쉽게 이해할 수 있을 것입니다.

원래 API를 위해서 정의된 매크로 리스트
  • const int MOUSEEVENTF_ABSOLUTE = 0x8000;
  • const int MOUSEEVENTF_LEFTDOWN = 0x0002;
  • const int MOUSEEVENTF_LEFTUP = 0x0004;
  • const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
  • const int MOUSEEVENTF_MIDDLEUP = 0x0040;
  • const int MOUSEEVNETF_MOVE = 0x0001;
  • const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
  • const int MOUSEEVENTF_RIGHTUP = 0x0010;
  • const int MOUSEEVENTF_WHEEL = 0x0800;
  • const int MOUSEEVENTF_XDOWN = 0x0080;
  • const int MOUSEEVENTF_XUP = 0x0100;
  • const int MOUSEEVENTF_HWHEEL = 0x1000;
위의 매크로들이 너무 길어서 짧게 고쳤습니다.

[Flags()]
public enum MouseEventFlag : int
{
Absolute = 0x8000,
LeftDown = 0x0002,
LeftUp = 0x0004,
MiddleDown = 0x0020,
MiddleUp = 0x0040,
Move = 0x0001,
RightDown = 0x0008,
RightUp = 0x0010,
Wheel = 0x0800,
XDown = 0x0080,
XUp = 0x0100,
HWheel = 0x1000,
}

여기서 Absolute 란 절대적인 좌표로 마우스를 이동시키는 것을 의미합니다.

마우스를 움질일 때 이 상수를 사용하지 않으면

현재 마우스 좌표를 기준으로 움직이고

이 상수를 사용하면

정확히 정한 좌표로 움직입니다.


2. enum MouseButton

public enum MouseButton
{
Left,
Right,
Middle,
X,
}

3. class Size

public class Size
{
public double Width { set; get; }
public double Height { set; get; }

public Size() { }
public Size(double Width, double Height)
{ this.Width = Width; this.Height = Height; }
}

4. class Point

public struct Point
{
public double X { set; get; }
public double Y { set; get; }

public Point(double X, double Y)
: this()
{ this.X = X; this.Y = Y; }
}

3. class MyMouse

이제 본격적인 본체입니다.

//필요한 네임스페이스
using System;
using System.Runtime.InteropServices; // DllImport를 위한 네임스페이스

public class MyMouse
{
// API함수를 C#에서 사용할 수 있도록 합니다.
#region DllImport
DllImport("User32.dll", CharSet = CharSet.Auto)]
private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo);
#endregion

// 절대적인 좌표로 마우스를 움직일때, 약간 특수한 계산이 필요합니다.
#region Constant
const int ABSOLUTE_SIZE = 65535;
#endregion

// 절대적인 좌표로 마우스를 움질일때, 화면 크기를 꼭 알아야합니다.
#region Property
public Size DisplaySize { set; get; }
#endregion

// 마우스를 제어하는 함수들입니다.
#region Moving
public void Move(Point Point) { MouseEventFlag Flag = MouseEventFlag.Move; mouse_event((int)Flag, (int)Point.X, (int)Point.Y, 0, IntPtr.Zero); } public void MoveAt(Point Point) { MouseEventFlag Flag = MouseEventFlag.Move | MouseEventFlag.Absolute;
int X = (int)(ABSOLUTE_SIZE / DisplaySize.Width * Point.X); int Y = (int)(ABSOLUTE_SIZE / DisplaySize.Height * Point.Y); mouse_event((int)Flag, X, Y, 0, IntPtr.Zero); } public void MoveAbsolute(Point Point) { MouseEventFlag Flag = MouseEventFlag.Move | MouseEventFlag.Absolute; mouse_event((int)Flag, (int)Point.X, (int)Point.Y, 0, IntPtr.Zero); } #endregion #region Input public void Down(MouseButton Button) { MouseEventFlag Flag = null; switch (Button) { case MouseButton.Left: Flag = MouseEventFlag.LeftDown; break; case MouseButton.Right: Flag = MouseEventFlag.RightDown; break; case MouseButton.Middle: Flag = MouseEventFlag.MiddleDown; break; case MouseButton.X: Flag = MouseEventFlag.XDown; break; } mouse_event((int)Flag, 0, 0, 0, IntPtr.Zero); } public void Up(MouseButton Button) { MouseEventFlag Flag = null; switch (Button) { case MouseButton.Left: Flag = MouseEventFlag.LeftUp; break; case MouseButton.Right: Flag = MouseEventFlag.RightUp; break; case MouseButton.Middle: Flag = MouseEventFlag.MiddleUp; break; case MouseButton.X: Flag = MouseEventFlag.XUp; break; } mouse_event((int)Flag, 0, 0, 0, IntPtr.Zero); } #endregion
}

예제 : https://www.dropbox.com/s/k9sobbrkgn9yo5m/MouseControlExample.zip?dl=0
Visual Studio 2015 프로젝트입니다

예제 파일만 실행하시려면 [MouseTracker]->[bin]->[Debug]->[MouseTracker.exe]를 실행하시길 바랍니다

댓글 없음:

댓글 쓰기