tips - マウスポインタの位置を変更する

 WPF ではマウスポインタの位置をコードから変更する方法がありません。 したがって、Win32 API を利用する必要があります。

コード例

 Win32 API を利用するためには User32.dll をインポートする必要があります。 その上で、マウスポインタの位置を設定するには SetCursorPos() メソッドを使用するため、 次のようなコードになります。

namespace WpfApplication1
{
    using System.Runtime.InteropServices;

    /// <summary>
    /// Win32 API を使用したメソッドをまとめたクラス
    /// </summary>
    public class User32
    {
        /// <summary>
        /// マウス関連のメソッドをまとめたクラス
        /// </summary>
        public class Mouse
        {
            [DllImport("User32.dll")]
            private static extern bool SetCursorPos(int X, int Y);

            /// <summary>
            /// マウスカーソルの位置を設定します。
            /// </summary>
            /// <param name="a">X 座標を指定します。</param>
            /// <param name="b">Y 座標を指定します。</param>
            public static void SetPosition(int a, int b)
            {
                SetCursorPos(a, b);
            }
        }
    }
}
Code 1 : Win32 API によるマウスポインタの位置設定用メソッドの定義

 上記のコードを実際に使ってみましょう。 今回はテストのため View 側のコードビハインドに記述してみます。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        MouseLeftButtonDown="Window_MouseLeftButtonDown">
    <Grid>
        <TextBlock Text="Click this window." />
    </Grid>
</Window>
Code 2 : MouseLeftButtonDown イベントハンドラを登録する
namespace WpfApplication1
{
    using System.Windows;
    using System.Windows.Input;

    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            User32.Mouse.SetPosition(0, 0);
        }
    }
}
Code 3 : コードビハインドにイベントハンドラを記述する
ウィンドウ上でマウス左ボタンを押すと、マウスカーソルが画面左上に移動するようになります。

 SetCursorPos() 関数には画面に対する絶対座標を指定するため、 ウィンドウの左上に移動したい場合はまずウィンドウ自体の画面座標を取得する必要があります。 例えば下記のようなコードにすることでウィンドウ左上座標に移動するようになります。

private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    // 自分の原点を画面からみた座標に変換する
    var pt = this.PointToScreen(new Point(0, 0));
    User32.Mouse.SetPosition((int)pt.X, (int)pt.Y);
}
Code 4 : ウィンドウの左上座標を指定する

Designed by CSS.Design Sample