1.21 jigowatts

Great Scott!

【C#】カーソル位置の取得

概要

カーソルの座標が知りたいんだけど、Win32APIで取れるんじゃね?って言われたので書いてみることに。System.Windows.FormsCursorクラス使ったほうがいいともあったので両方試してみます。XとYの値表示するだけだからコンソールアプリでいいよね。

環境

Visual Studio Community 2017

System.Windows.Forms版の実装

あら、簡単。System.Windows.Formsを参照に追加できない特別な理由がないならこっちでいいんじゃないかな。

using System;
using System.Threading;
using System.Windows.Forms;

namespace CursorPosition
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                var pt = Cursor.Position;
                Console.WriteLine($"X:{pt.X} Y:{pt.Y}");
                Thread.Sleep(100);
                Console.Clear();
            }
        }
    }
}

Win32API版の実装

今の現場の人たちすぐWin32API使ってなんとかしようとするんですよね。そんなん使ったことないよ!初めての実装なので雰囲気だけでも掴めたらokでしょう。

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Threading;

namespace Win32APICursorPosition
{
    class Program
    {
        #region Win32API
        [DllImport("User32.dll")]
        static extern bool GetCursorPos(out POINT lppoint);
        [StructLayout(LayoutKind.Sequential)]
        struct POINT
        {
            public int X { get; set; }
            public int Y { get; set; }
            public static implicit operator Point(POINT point)
            {
                return new Point(point.X, point.Y);
            }
        }
        #endregion

        public static Point GetCursorPosition()
        {
            var pt = new POINT();
            GetCursorPos(out pt);
            return pt;
        }

        static void Main(string[] args)
        {
            while (true)
            {
                var pt = GetCursorPosition();
                Console.WriteLine($"X:{pt.X} Y:{pt.Y}");
                Thread.Sleep(100);
                Console.Clear();
            }
        }
    }
}