The events for the mouse can be called through C# via the interop using a delegate.
In C++/CLI:
public ref class GameWindow : public HwndHost
{
delegate void func0();
func0^ OnLeftMouseDown;
func0^ OnRightMouseDown;
func0^ OnMiddleMouseDown;
func0^ OnMouseMove;
IntPtr WndProc( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, bool% handled )
{
switch( msg )
{
case WM_IME_SETCONTEXT:
if( LOWORD( wParam.ToInt32() ) > 0)
SetFocus( mHWND );
handled = true;
return IntPtr::Zero;
case WM_LBUTTONDOWN:
OnLeftMouseDown();
handled = true;
return IntPtr::Zero;
case WM_RBUTTONDOWN:
OnRightMouseDown();
handled = true;
return IntPtr::Zero;
case WM_MBUTTONDOWN:
OnMiddleMouseDown();
handled = true;
return IntPtr::Zero;
case WM_MOUSEMOVE:
OnMouseMove();
handled = true;
return IntPtr::Zero;
}
handled = false;
return IntPtr::Zero;
}
};
In C#:
public partial class MainWindow : Window
{
private GameWindow mWindowWorld;
private Point mMousePos;
private void Window_Loaded( Object sender, RoutedEventArgs e )
{
mWindowWorld = new GameWindow();
mWindowWorld.OnLeftMouseDown = Window_World_OnLeftMouseDown;
mWindowWorld.OnRightMouseDown = Window_World_OnRightMouseDown;
mWindowWorld.OnMiddleMouseDown = Window_World_OnMiddleMouseDown;
mWindowWorld.OnMouseMove = Window_World_OnMouseMove;
Window_World.Child = mWindowWorld;
}
private void Window_World_OnLeftMouseDown()
{
}
private void Window_World_OnRightMouseDown()
{
}
private void Window_World_OnMiddleMouseDown()
{
}
private void Window_World_OnMouseMove()
{
Point mousePos = Mouse.GetPosition( mWindowWorld );
mMousePos = new Point( mousePos.X, mousePos.Y );
}
};
Although creating delegates is one solution, I ultimately ended up creating each mouse button function in the GameWindow class for code cleanliness. I then derived from that class, so I could keep the HwndHost separated from the main app.