【C#】カーソル位置の取得
概要
カーソルの座標が知りたいんだけど、Win32APIで取れるんじゃね?って言われたので書いてみることに。System.Windows.Forms
のCursor
クラス使ったほうがいいともあったので両方試してみます。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(); } } } }