2008年1月16日水曜日

マウスの位置を取得し続ける(C#)

マウスの位置を取得し続けるプログラムを考えてみる。

.Net Frameworkには"System.Windows.Forms.Cursor"というクラスがあります。

このクラスは「マウスポインタの描画に使用されるイメージを表します。」だそうです。

簡単に言うと、マウスポインタだと。

この"Cursor"クラスを使って,マウスの位置(X座標,Y座標)を取得するには,

Cursor.Position.X
Cursor.Position.Y

を使用します。

これを使って、100ms毎にマウスの位置を取得し,
"Form1"のタイトルに表示し続けるプログラムを作ってみましょう。
("ファイル" > "新しいプロジェクト" > "Windows フォームアプリケーション")

/*** Form1.cs ***/
public Form1()
{
InitializeComponent();

new Thread(new ThreadStart(GetMousePosition)).Start();
}

public void GetMousePosition()
{
while (true)
{
SetText();
Thread.Sleep(100);
}
}

public delegate void SetTextDelegate();

public void SetText()
{
if (InvokeRequired)
{
Invoke(new SetTextDelegate(SetText));
return;
}
this.Text = "x = " + Cursor.Position.X + " : y = " + Cursor.Position.Y;
}

"Thread"クラスを扱うために、"System.Threading"名前空間の修飾省略定義を
入れることをお忘れなく。

using System.Threading;
実行してみる。


どうやらマウスの位置を取得し続けているようだ。

意外なことに"Form1"の範囲外でも、マウスの位置を取得することができた。

ただ、これだと「100ms毎」という制限があり、雑な感じがする。
(だからと言って、1ms毎にすれば良いというわけでもない。)

また、「マウスの位置が○○に来たら」のようにイベントを設定することができない。("Form1"の範囲内でなら可能。)


簡単なものならこれでいいが、複雑なことを行いたい場合は別の方法で取得する必要がありそうだ。

注意:上記のプログラムをそのまま実行し、"Form1"の終了ボタンを押すと、
   "ObjectDisposedException"が投げられます。
   これは、終了ボタンを押したことで、オブジェクト"Form1"が解放(メモリ上から
   消える)されたにも関わらず、"SetText"内でアクセスしようとしたためです。
   必ず、終了ボタンが押された時に、スレッドを抜けるように作成して下さい。

0 件のコメント: