들어가며
저는 이 내용을 제가 만든 클래스를 바탕으로 소개하려고 합니다.
API 함수 중에서 mouse_event 라는 함수를 이용하여 만든 것입니다.
정확한 내용을 원하시면 MSDN 에 글이 있으니 읽어보시기를 바랍니다.
※주의 : 마우스 제어를 위한 모든 기능이 갖춰져 있는 것은 아닙니다.
※2013-11-16일 수정
※2016-10-15일 수정
WindowsForm의 기능을 이용하여 수정한 클래스와
WPF에서의 예제 추가
※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()]
[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;
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
#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]를 실행하시길 바랍니다
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]를 실행하시길 바랍니다
댓글 없음:
댓글 쓰기