- PR -

C#で、マウスのポインタの現在の座標を取得したい

1
投稿者投稿内容
カレー落武者
常連さん
会議室デビュー日: 2003/09/12
投稿数: 49
投稿日時: 2005-04-20 19:13
最近C#を使い始めたのですが、件名のような事を行おうとした所、サンプルが見当たらず、やむを得ずVBのサンプルを参考にして以下のような処理を作ってみました。
しかし、うまく動きません。

参考にしたのは以下のサイトです。
http://vbvbvb.com/jp/gtips/1001/gGetCursorPos.html


僕が書いたソースは以下の通りです。

------------------------------------------------------------
using System.Runtime.InteropServices;

//タイマーイベント
private void timer1_Tick(object sender, System.EventArgs e)
{
tagPOINT pt = new tagPOINT();
pt.x = 0;
pt.y = 0;
GetCursorPos(pt);
}

//GetCursorPosで現在座標を取得
[DllImport("user32.dll")]
private static extern void GetCursorPos(
tagPOINT lpPoint
);

//現在座標が入る構造体
public struct tagPOINT
{
public UInt32 x;
public UInt32 y;
}

------------------------------------------------------------
実行すると、
「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。[続行]をクリックすると・・・」

というエラーメッセージが表示されます。
元のサンプルとそれほど違っていないように見えるのですが、どなたかお解りにならないでしょうか?
何かすごく基本的なミスをしているのでは無いかと考えているのですが、いまいち解らないのです。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-04-20 19:35
Cursor.Position.X
Cursor.Position.Y
では取得できなかった?

_________________
たつごろー
codeseek
こみゅぷらす
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-04-20 19:45
何故肝心の例外の内容は書かないのでしょうか?
例外が投げられたら、まずメッセージを確認して下さい。
問題解決の大きな助けになるはずです。

さて、できれば.NET Framework内で完結する方が自然ですから、できればDllImportはしないでおきましょう。
ウィンドウ関連のクラスはSystem.Windows.Forms名前空間に収められています。
この名前空間内のクラスを眺めていると、Cursorというそれっぽい名前のクラスが見つかります。
ではこのクラスのメンバを調べてみましょう。
Positionなんてそのままのプロパティが見つかりました。
staticですからインスタンスを作らずに使える、まさに要望通りのプロパティです。

DllImportについては、C言語のポインタの知識、値渡しと参照渡し、refキーワードやoutキーワードなど知っているべき知識がそれなりにあります。
MSDNのアンマネージ コードとの相互運用の項目を良く読んで勉強して下さい。
カレー落武者
常連さん
会議室デビュー日: 2003/09/12
投稿数: 49
投稿日時: 2005-04-21 09:50
いろいろとご意見をありがとうございます。

Cursor.Position.X
Cursor.Position.Y

で確かに目的が果たせました。こんな簡単だったんですね。ありがとうございます。

例外については、調べてみたら
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
でした。今後は記載するようにします。try〜catchで簡単に調べられるんですね。

DllImportについては、もっと勉強しないと使いこなせないと感じました。
勉強して出直してきます。

たつごろーさん、Hongliangさん、ありがとうございました。
また解らない事があったらぜひ質問させてください。
1

スキルアップ/キャリアアップ(JOB@IT)