2017-11-07 10 views
0

WPFアプリケーション内でDirectXコンテンツをホストしようとしています。私がこのリンクから学んだことは、 HwndHostをサブクラス化し、BuildWindowCoreとDestroyWindowCoreだけでなくWndProcの独自の実装を作成することです。 https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/walkthrough-hosting-a-win32-control-in-wpf#implement-a-class-to-host-the-microsoft-win32-controlC#でMouseMoveとMouseWheelを処理するHwndHostを実装するWPF

私は、ここに同じ、次のかなり多くの有用なimplemenationが見つかりました: https://github.com/Smartrak/WpfSharpDxControl/blob/master/WpfSharpDxControl/Win32HwndControl.cs

は今、私はそのようなWM_MOUSEMOVE(0x0200)とWM_MOUSEWHEEL(0x020A)として2つのメソッドを実装する必要があります。 マウスホイールのデルタやタイムスタンプなどの情報を渡すために正しく行う方法がわかりません。 この方向のポインタは本当に役に立ちます。

protected override IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 
     switch (msg) 
     { 
      case NativeMethods.WM_MOUSEMOVE: 
       //What should go here 
       break; 
      case NativeMethods.WM_MOUSEWHEEL: 
       //What should go here 
       break; 
      case NativeMethods.WM_LBUTTONDOWN: 
       RaiseMouseEvent(MouseButton.Left, Mouse.MouseDownEvent); 
       break; 

      case NativeMethods.WM_LBUTTONUP: 
       RaiseMouseEvent(MouseButton.Left, Mouse.MouseUpEvent); 
       break; 

      case NativeMethods.WM_RBUTTONDOWN: 
       RaiseMouseEvent(MouseButton.Right, Mouse.MouseDownEvent); 
       break; 

      case NativeMethods.WM_RBUTTONUP: 
       RaiseMouseEvent(MouseButton.Right, Mouse.MouseUpEvent); 
       break; 
     } 

     return base.WndProc(hwnd, msg, wParam, lParam, ref handled); 
    } 

おかげで、 ジェイ

+0

これはWINAPIである、あなたは、MSDN(例えば、[WM_MOUSEMOVE](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645616(V = VS.85)を検討する必要があります。 aspx))、 'lParam'と' wParam'に関する詳細を知っています。 'WM_MOUSEMOVE'の場合は、(hwndウィンドウに対して)クライアント単位でマウス位置のx座標とy座標を得るために、' lParam'の符号付きの下位および上位ワード(16ビット)を抽出する必要があります。 – Sinatr

+0

ありがとう@Sinatr。私は今試してみる。 –

答えて

0

は、私は最終的に答えを発見し、正確な実装は、私がここに欲しかっ:

https://github.com/tgjones/gemini/blob/master/src/Gemini/Framework/Controls/HwndWrapper.cs

それは完璧に動作します。 NativeMethods.GetWheelDeltaWParam(Convert.ToInt32(value))のOverFlow例外が発生した場合。

使用 NativeMethods.GetWheelDeltaWParam(Convert.ToInt64(value));

このすばらしいギターのレポと仕事のためのティムジョーンズのフルクレジット! https://github.com/tgjones

関連する問題