特定のコントロール内で機能しますが、特定のコントロールでは機能しません。
(プラットフォーム呼び出しなしで)画面から直接マウスの位置を取得し、コントロールから独立してマウスイベントを使用する方法は?
必要な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);
特定のコントロールからマウスの位置を取得しません。
コントロールのMouseDown
イベントを使用して、これを試すことができます:
_var point = e.GetPosition(this.YourControl);
_
EDIT:Mouse.Capture(YourControl);
を使用して特定のコントロールにマウスイベントをキャプチャできるため、オンになっていない場合でもマウスイベントをキャプチャできます。そのコントロール。 リンク
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 [〜#〜] から
指定された要素へのマウス入力をキャプチャします。
新しいものはほとんど見つかりませんでしたが、
コードは以下のとおりです。最初に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();
}
}