web-dev-qa-db-ja.com

WPFで現在のマウス画面座標を取得するにはどうすればよいですか?

画面上で現在のマウスの調整を取得する方法は?要素のmousePositionを取得するMouse.GetPosition()のみを知っていますが、要素を使用せずに調整を取得したいです。

63
Prince OfThief

レイチェルの答えをフォローアップする。
WPFでマウススクリーン座標を取得する方法は2つあります。

1. Windowsフォームの使用。 System.Windows.Formsへの参照を追加します

public static Point GetMousePositionWindowsForms()
{
    System.Drawing.Point point = Control.MousePosition;
    return new Point(point.X, point.Y);
}

2.Win32を使用する

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);

[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
    public Int32 X;
    public Int32 Y;
};
public static Point GetMousePosition()
{
    Win32Point w32Mouse = new Win32Point();
    GetCursorPos(ref w32Mouse);
    return new Point(w32Mouse.X, w32Mouse.Y);
}
68
Fredrik Hedblad

または、純粋なWPFで PointToScreen を使用します。

サンプルヘルパーメソッド:

// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
    return _window.PointToScreen(Mouse.GetPosition(_window))
}
67
erikH

画面またはアプリケーションを基準とした座標が必要ですか?

アプリケーション内にある場合は、次を使用します。

Mouse.GetPosition(Application.Current.MainWindow);

そうでない場合、System.Windows.Formsへの参照を追加して使用できると思います:

System.Windows.Forms.Control.MousePosition;
27
Rachel

これらの回答の多くを異なる解像度、複数のモニターを搭載したコンピューターなどで試してみると、確実に動作しないことがあります。これは、トランスフォームを使用して、すべてのモニターで構成される表示領域全体ではなく、現在の画面に対するマウスの位置を取得する必要があるためです。このようなもの...(「this」はWPFウィンドウです)。

var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
var mouse = transform.Transform(GetMousePosition());

public System.Windows.Point GetMousePosition()
{
    System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
    return new System.Windows.Point(point.X, point.Y);
}
18
Alexandru

これは、フォームを使用したりDLLをインポートしたりすることなく機能します。

   using System.Windows;
   using System.Windows.Input;

    /// <summary>
    /// Gets the current mouse position on screen
    /// </summary>
    private Point GetMousePosition()
    {
        // Position of the mouse relative to the window
        var position = Mouse.GetPosition(Window);

        // Add the window position
        return new Point(position.X + Window.Left, position.Y + Window.Top);
    }
5
hemligaarne

TimerDispatcher(WPFタイマーアナログ)とWindowsの「フック」の組み合わせを使用して、運用システムからカーソル位置をキャッチできます。

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorPos(out POINT pPoint);

ポイントはライトstructです。 X、Yフィールドのみが含まれます。

    public MainWindow()
    {
        InitializeComponent();

        DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
        dt.Tick += new EventHandler(timer_tick);
        dt.Interval = new TimeSpan(0,0,0,0, 50);
        dt.Start();
    }

    private void timer_tick(object sender, EventArgs e)
    {
        POINT pnt;
        GetCursorPos(out pnt);
        current_x_box.Text = (pnt.X).ToString();
        current_y_box.Text = (pnt.Y).ToString();
    }

    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }

また、この解決策は、頻繁にまたはあまり頻繁に行わないパラメーター読み取りの問題を解決しているので、自分で調整できます。ただし、ticksではなくmillisecondsを表す1つの引数を使用したWPFメソッドのオーバーロードを思い出してください。

TimeSpan(50); //ticks
1
Max Bender

あなたが1ライナーを探しているなら、これはうまくいく。

new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)
1
Jesse Grunert

コントロールで使用するためにこれを追加します

   private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
 var mousepos = new List<double> { e.GetPosition(ControlName).X, e.GetPosition(ControlName).Y };

}
0

Mouse.GetPosition(mWindow)は、選択したパラメーターに対するマウスの位置を示します。 mWindow.PointToScreen()は、位置を画面に相対的なポイントに変換します。

したがって、mWindow.PointToScreen(Mouse.GetPosition(mWindow))は、mWindowがウィンドウであると仮定して、画面に対するマウスの位置を示します(実際、System.Windows.Media.Visualから派生したクラスにはこの関数があります)。これをWPFウィンドウクラス内で使用すると、thisが機能するはずです。

0
Fire1nRain