1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { // 関数が存在するDLLを指定する。 [System.Runtime.InteropServices.DllImport("user32.dll")] // extern // 関数の実体が外部にあることを示す。 static extern int GetCursorPos(out LPPOINT lppoint); public Form1() { InitializeComponent(); MouseMove += (s, e) => { // スクリーン座標(Form上しか拾わない) label1.Text = "X / Y : " + Cursor.Position.X.ToString() + " / " + Cursor.Position.Y.ToString(); // クライアント座標 label2.Text = "X / Y : " + e.X.ToString() + " / " + e.Y.ToString(); }; Timer timer = new Timer(); timer.Interval = 1; timer.Tick += (s, e) => { // スクリーン座標 GetCursorPos() var p = new LPPOINT(); GetCursorPos(out p); label3.Text = "X / Y : " + p.X.ToString() + " / " + p.Y.ToString(); }; timer.Start(); } // StructLayout(LayoutKind.Sequential) // API/DLLとやりとりする構造体の場合、メンバのメモリ上の位置をAPI/DLLと一致させる必要がある。 // LayoutKind.Sequentialと指定すると宣言通りとなる。 [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct LPPOINT { public int X { get; set; } public int Y { get; set; } // implicit operator xxx // implicit operatorを定義しているクラス自身が // xxx型にキャストされたときに動作するコンストラクタ public static implicit operator Point(LPPOINT point) { return new Point(point.X, point.Y); } } } } |