web-dev-qa-db-ja.com

WPFの画面上のマウス位置を取得する方法は?

特定のコントロール内で機能しますが、特定のコントロールでは機能しません。

(プラットフォーム呼び出しなしで)画面から直接マウスの位置を取得し、コントロールから独立してマウスイベントを使用する方法は?

必要な2つのポイント:

  1. マウスがコントロール内ではなく画面上にある場合のマウスイベント。
  2. マウスがコントロール内ではなく画面上にあるときのマウスの位置。

Platform Invokeを使用せずに解決する必要があります。

次の2つは機能しません。

System.Windows.Input.Mouse.GetPosition(this)

特定のコントロールからマウスの位置を取得しません。

System.Windows.Forms.Cursor.Position.X

System.Windows.Forms.Cursor.Positionは、WPFアプリでは型を持たないため機能しませんが、Windowsフォームアプリでは機能します。

IntelliSenseはSystem.Windows.Forms.Cursor.Positionを取得しますが、どのタイプのPositionも取得しないため、取得できません:

Position.X    
Position.Y

そして

Point pointToWindow = Mouse.GetPosition(this);

Point pointToScreen = PointToScreen(pointToWindow);

特定のコントロールからマウスの位置を取得しません。

14
Ziya Ceferov

コントロールのMouseDownイベントを使用して、これを試すことができます:

_var point = e.GetPosition(this.YourControl);
_

EDIT:Mouse.Capture(YourControl);を使用して特定のコントロールにマウスイベントをキャプチャできるため、オンになっていない場合でもマウスイベントをキャプチャできます。そのコントロール。 リンク

13

PointToScreen を使用できます

Visualの現在の座標系を表すPointを画面座標のPointに変換します。

このようなもの:

_private void MouseCordinateMethod(object sender, MouseEventArgs e)
{
    var relativePosition = e.GetPosition(this);
    var point= PointToScreen(relativePosition);
    _x.HorizontalOffset = point.X;
    _x.VerticalOffset = point.Y;
}
_

_Mouse.GetPosition_はPointを返し、PointToScreenはポイントをスクリーン座標に変換することに注意してください

編集:

Mouse.Capture(SepcificControl);を使用できます。 [〜#〜] msdn [〜#〜] から

指定された要素へのマウス入力をキャプチャします。

9
Rahul Tripathi

新しいものはほとんど見つかりませんでしたが、

コードは以下のとおりです。最初にWindowをビルドして実行します。

その後、ウィンドウ上でマウスを1回動かして、マウス位置の無限の画面検出を呼び出します。

(したがって、質問の2番目のポイントでコントロールからのマウスイベントを検出する方法を見つけられませんでしたが、同様の方法でエンドレススレッドを使用します。)

ただし、純粋なメソッドでフォームコードを使用するだけで、WPFプロジェクトでWindows.Formsを有効にするために少しのスキルを使用し、イベントコードブロックでそのメソッドを参照します。

コードはこちら:

プロジェクトに2つの参照を追加します。

System.Drawing 
System.Windows.Forms

Xamlパーツ:

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        xmlns:g="clr-namespace:Gma.UserActivityMonitor;Assembly=Gma.UserActivityMonitor"
        Title="MainWindow" Height="350" Width="525" 
        MouseWheel="MainWindow_OnMouseWheel">
    <Grid>
       <TextBlock Name="TBK" /> 
    </Grid>
</Window>

クラスコード:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public void KeepReportMousePos()
        {
            //Endless Report Mouse position
            Task.Factory.StartNew(() =>
            {
                while(true){
                    this.Dispatcher.Invoke(
                        DispatcherPriority.SystemIdle,
                        new Action(() =>
                        {
                            GetCursorPos();
                        }));
                }
            });
        }
        public void GetCursorPos()
        {
            //get the mouse position and show on the TextBlock
            System.Drawing.Point p = System.Windows.Forms.Cursor.Position;
            TBK.Text = p.X + " " + p.Y;
        }

        private void MainWindow_OnMouseWheel(object sender, MouseWheelEventArgs e)
        {
            //invoke mouse position detect when wheel the mouse
            KeepReportMousePos();
        }
    }
0
yu yang Jian