첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ 마우스 이벤트를 발생시키는 방법을 보여준다.

TestProject.zip
0.01MB

▶ MouseEventFlags.cs

namespace TestProject;

/// <summary>
/// 마우스 이벤트 플래그
/// </summary>
[Flags]
public enum MouseEventFlags
{
    /// <summary>
    /// 이동
    /// </summary>
    Move = 0x00000001,

    /// <summary>
    /// 왼쪽 DOWN
    /// </summary>
    LeftDown = 0x00000002,

    /// <summary>
    /// 왼쪽 UP
    /// </summary>
    LeftUp = 0x00000004,

    /// <summary>
    /// 오른쪽 DOWN
    /// </summary>
    RightDown = 0x00000008,

    /// <summary>
    /// 오른쪽 UP
    /// </summary>
    RightUp = 0x00000010,

    /// <summary>
    /// 가운데 DOWN
    /// </summary>
    MiddleDown = 0x00000020,

    /// <summary>
    /// 가운데 UP
    /// </summary>
    MiddleUp = 0x00000040,

    /// <summary>
    /// 절대
    /// </summary>
    Absolute = 0x00008000
};

 

▶ MousePoint.cs

using System.Runtime.InteropServices;

namespace TestProject;

/// <summary>
/// 마우스 포인트
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct MousePoint
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Field
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region Field

    /// <summary>
    /// X
    /// </summary>
    public int X;

    /// <summary>
    /// Y
    /// </summary>
    public int Y;

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - MousePoint(x, y)

    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="x">X</param>
    /// <param name="y">Y</param>
    public MousePoint(int x, int y)
    {
        X = x;
        Y = y;
    }

    #endregion
}

 

▶ MouseHelper.cs

using System.Runtime.InteropServices;

namespace TestProject;

/// <summary>
/// 마우스 헬퍼
/// </summary>
public static class MouseHelper
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Import
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Private

    #region 커서 위치 설정하기 - SetCursorPos(x, y)

    /// <summary>
    /// 커서 위치 설정하기
    /// </summary>
    /// <param name="x">X</param>
    /// <param name="y">Y</param>
    /// <returns>처리 결과</returns>
    [DllImport("user32", EntryPoint = "SetCursorPos")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetCursorPos(int x, int y);

    #endregion
    #region 커서 위치 구하기 - GetCursorPos(mousePoint)

    /// <summary>
    /// 커서 위치 구하기
    /// </summary>
    /// <param name="mousePoint">마우스 포인트</param>
    /// <returns>처리 결과</returns>
    [DllImport("user32")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetCursorPos(out MousePoint mousePoint);

    #endregion
    #region 마우스 이벤트 발생시키기 - mouse_event(flag, deltaX, deltaY, data, extraInformation)

    /// <summary>
    /// 마우스 이벤트 발생시키기
    /// </summary>
    /// <param name="flag">플래그</param>
    /// <param name="deltaX">델타 X</param>
    /// <param name="deltaY">델타 Y</param>
    /// <param name="data">데이터</param>
    /// <param name="extraInformation">부가 정보</param>
    [DllImport("user32")]
    private static extern void mouse_event(int flag, int deltaX, int deltaY, int data, int extraInformation);

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Public

    #region 커서 위치 설정하기 - SetCursorPosition(mousePoint)

    /// <summary>
    /// 커서 위치 설정하기
    /// </summary>
    /// <param name="mousePoint">마우스 포인트</param>
    public static void SetCursorPosition(MousePoint mousePoint)
    {
        SetCursorPos(mousePoint.X, mousePoint.Y);
    }

    #endregion
    #region 커서 위치 설정하기 - SetCursorPosition(x, y)

    /// <summary>
    /// 커서 위치 설정하기
    /// </summary>
    /// <param name="x">X</param>
    /// <param name="y">Y</param>
    public static void SetCursorPosition(int x, int y)
    {
        SetCursorPos(x, y);
    }

    #endregion
    #region 커서 위치 구하기 - GetCursorPosition()

    /// <summary>
    /// 커서 위치 구하기
    /// </summary>
    /// <returns>마우스 포인트</returns>
    public static MousePoint GetCursorPosition()
    {
        MousePoint mousePoint;

        bool result = GetCursorPos(out mousePoint);

        if(!result)
        {
            mousePoint = new MousePoint(0, 0);
        }

        return mousePoint;
    }

    #endregion
    #region 마우스 이벤트 발생시키기 - MouseEvent(flag)

    /// <summary>
    /// 마우스 이벤트 발생시키기
    /// </summary>
    /// <param name="flag">플래그</param>
    public static void MouseEvent(MouseEventFlags flag)
    {
        MousePoint mousePoint = GetCursorPosition();

        mouse_event((int)flag, mousePoint.X, mousePoint.Y, 0, 0);
    }

    #endregion
}

 

▶ MainForm.cs

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            this.executeButton.Click     += executeButton_Click;
            this.showMessageButton.Click += showMessageButton_Click;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 실행 버튼 클릭시 처리하기 - executeButton_Click(sender, e)

        /// <summary>
        /// 실행 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void executeButton_Click(object sender, EventArgs e)
        {
            Point clientPoint = this.showMessageButton.Location;
            Point screenPoint = PointToScreen(clientPoint);

            screenPoint.X += this.showMessageButton.Width  / 2;
            screenPoint.Y += this.showMessageButton.Height / 2;

            MouseHelper.SetCursorPosition(screenPoint.X, screenPoint.Y);

            MouseHelper.MouseEvent(MouseEventFlags.LeftDown);
            MouseHelper.MouseEvent(MouseEventFlags.LeftUp  );
        }

        #endregion
        #region 메시지 표시 버튼 클릭시 처리하기 - showMessageButton_Click(sender, e)

        /// <summary>
        /// 메시지 표시 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void showMessageButton_Click(object sender, EventArgs e)
        {
            MessageBox.Show(this, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요