複数の要素 (ボタン、テキスト ボックスなど) を含む WPF グリッドをビットマップにレンダリングしています。ビットマップは、Direct3D シーンの 3D サーフェスのテクスチャとして使用されます。ユーザー インタラクションのために、2D マウス カーソルの位置から 3D シーンに 3D レイを作成し、GUI サーフェスとの交点を見つけます。したがって、ユーザーが WPF グリッドのどこをクリックしたかはわかっていますが、そこから行き詰まりました。
開いているウィンドウに実際には表示されず、画面外にレンダリングされているときに、WPF 要素でマウス イベントをシミュレートするにはどうすればよいですか?
最近、UIAutomation と RaiseEvent を調べていましたが、これらはビジュアル ツリー全体ではなく、個々の要素にイベントを送信するために使用されます。ツリーを手動でトラバースし、カーソル位置で要素を探すことはオプションですが、これを正確に行う方法が見つかりませんでした。VisualTreeHelper.HitTest は良いスタートですが、TextBox を見つける代わりに TextBoxView を見つけ、ListBox の代わりに Border を見つけます。
編集: HitTest の結果コールバックで HitTestResultBehavior.Continue を返すと、特定の時点ですべての要素をウォークスルーできます。これらすべての要素にマウス イベントを送信できるようになりましたが、MouseEventArgs オブジェクトの値は実際のマウスの値です。したがって、明らかに不可能なカスタム MouseDevice を作成する必要があります。
PointHitTestParameters p = new PointHitTestParameters(new Point(
((Vector2)hit).X * sourceElement.ActualWidth,
(1 - ((Vector2)hit).Y) * sourceElement.ActualHeight));
VisualTreeHelper.HitTest(sourceElement,
new HitTestFilterCallback(delegate(DependencyObject o)
{
return HitTestFilterBehavior.Continue;
}),
new HitTestResultCallback(delegate(HitTestResult r)
{
UIElement el = r.VisualHit as UIElement;
if (el != null)
{
MouseButtonEventArgs e = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left);
if (leftMouseDown) e.RoutedEvent = Mouse.MouseDownEvent;
else e.RoutedEvent = Mouse.MouseUpEvent;
el.RaiseEvent(e);
}
return HitTestResultBehavior.Continue;
}), p);