DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォーム上のマウス座標(GetCursorPos)

環境/言語:[WindowsVista VB.NET]
分類:[.NET]

皆さんお疲れ様です。
質問側ばかりですいませんが、またお世話になります。

VB.NET 2005でGetCursorPosを用いて、
フォーム座標を常に取得する記述をしたいのですが、
スクリーン座標からの変換方法が分かりません。
(Me.PointToClient(Windows.Forms.Cursor.Position)をどこかに適当に入れればいいと楽観してたんですが・・・)

コードは「主婦と .NET と犬の記録」さんのところからそのままいただきました。
http://naoko.wankuma.com/win32api/win32api_0007_GetCursorPos.html


Imports System.Runtime.InteropServices
''' <summary>
''' GetCursorPos(user32.dll)
''' </summary>
Partial Public Class F0007_GetCursorPos

''' <summary>
''' GetCursorPos(マウスの座標を取得)の宣言
''' </summary>
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function GetCursorPos(ByRef lpPoint As POINT) _
As Boolean
End Function

''' <summary>
''' POINT 構造体
''' </summary>
Private Structure POINT
Public X As Integer
Public Y As Integer
End Structure

''' <summary>
''' ロード時のイベント
''' </summary>
Private Sub F0007_GetCursorPos_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Me.Text = "F0007_GetCursorPos"
Me.Label1.Text = ""
Me.Timer1.Interval = 100
Me.Timer1.Start()

End Sub

''' <summary>
''' 指定したタイマの間隔が経過した時のイベント
''' </summary>
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim lpPoint As POINT
GetCursorPos(lpPoint)

Me.Label1.Text = "X:" + lpPoint.X.ToString() + " Y:" + lpPoint.Y.ToString()
End Sub

End Class

よろしくお願いします。
Screen.TwipsPerPixelX
のことですか?
> Screen.TwipsPerPixelX
> のことですか?

返信ありがとうございます。
Screen.TwipsPerPixelXについては今検索した分の知識しかないので、なんとも言えないのですが、
Pixel⇔Twipsの変換のことをおっしゃっているのなら違います。

上記のコードだと、スクリーン座標のマウス位置を取得するので、フォーム座標を取得するようにしたいんです。

説明下手で申し訳ありません。
■No26279に返信(遊零さんの記事)
> VB.NET 2005でGetCursorPosを用いて、
> フォーム座標を常に取得する記述をしたいのですが、

フォームの位置そのものなら、Me.Location 等で取得できますし、
マウスカーソルの座標なら、GetCursorPos API を用いずとも、
Cursor.Position プロパティで取得できますよ。

Me.Label1.Text = Cursor.Position.ToString()
http://www.atmarkit.co.jp/fdotnet/dotnettips/377screentoclient/screentoclient.html


> スクリーン座標からの変換方法が分かりません。
> (Me.PointToClient(Windows.Forms.Cursor.Position)をどこかに適当に入れればいいと楽観してたんですが・・・)
あれ? Cursor.Position を使う方法も御存知なのですね…。

何に困っているのか良く分からないのですが、API を使わないなら
 Me.Label1.Text = Me.PointToClient(Cursor.Position).ToString()
で、API を使うのであれば
  Dim pt As System.Drawing.Point
  pt = Me.PointToClient(New System.Drawing.Point(lpPoint.X, lpPoint.Y))
  Me.Label1.Text = pt.ToString()
といった感じだと思います。

PointToClient の箇所も API にするなら、
  GetCursorPos(lpPoint)
  ScreenToClient(Me.Handle, lpPoint)
  Me.Label1.Text = String.Format("X:{0} Y:{1}", lpPoint.X, lpPoint.Y) 

  Private Declare Function ScreenToClient Lib "user32" _
    (ByVal hWnd As IntPtr, ByRef pt As POINT) _
    As <MarshalAs(UnmanagedType.Bool)> Boolean
とか。
■No26289に返信(魔界の仮面弁士さんの記事)
> ■No26279に返信(遊零さんの記事)
>>VB.NET 2005でGetCursorPosを用いて、
>>フォーム座標を常に取得する記述をしたいのですが、
>
> フォームの位置そのものなら、Me.Location 等で取得できますし、
> マウスカーソルの座標なら、GetCursorPos API を用いずとも、
> Cursor.Position プロパティで取得できますよ。
>
> Me.Label1.Text = Cursor.Position.ToString()
> http://www.atmarkit.co.jp/fdotnet/dotnettips/377screentoclient/screentoclient.html
>
>
>>スクリーン座標からの変換方法が分かりません。
>>(Me.PointToClient(Windows.Forms.Cursor.Position)をどこかに適当に入れればいいと楽観してたんですが・・・)
> あれ? Cursor.Position を使う方法も御存知なのですね…。
>
> 何に困っているのか良く分からないのですが、API を使わないなら
>  Me.Label1.Text = Me.PointToClient(Cursor.Position).ToString()
> で、API を使うのであれば
> Dim pt As System.Drawing.Point
> pt = Me.PointToClient(New System.Drawing.Point(lpPoint.X, lpPoint.Y))
> Me.Label1.Text = pt.ToString()
> といった感じだと思います。
>
> PointToClient の箇所も API にするなら、
> GetCursorPos(lpPoint)
> ScreenToClient(Me.Handle, lpPoint)
> Me.Label1.Text = String.Format("X:{0} Y:{1}", lpPoint.X, lpPoint.Y)
>
> Private Declare Function ScreenToClient Lib "user32" _
> (ByVal hWnd As IntPtr, ByRef pt As POINT) _
> As <MarshalAs(UnmanagedType.Bool)> Boolean
> とか。


返信ありがとうございます。
追記しようとした事柄まで答えていただき、とても助かりました。

えー、APIにこだわったのは、挑戦と課題、みたいなものでして。
(Cursor.Position と Timer の組み合わせは素でスルーしてましたが)

こちらの都合でお手数をおかけしました。精進します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板