1

複数の要素 (ボタン、テキスト ボックスなど) を含む 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);
4

2 に答える 2

0

PostMessage(..) win32 メソッドを介して、Windows メッセージ (WM_MOUSEMOVE など) を WPF ウィンドウの HWND に送信できる場合があります。これらのメッセージは WPF によって読み取られ、ユーザーから送信されたかのように実行されると思います。

于 2009-12-18T08:13:36.943 に答える