WPF HwndHost键盘焦点

时间:2010-05-16 14:45:03

标签: wpf winapi interop focus hosted

屏幕截图中的图表区域是一个HwndHost控件,它托管一个用C ++ / CLI实现并使用Direct2D绘制的本机Win32窗口(带有它自己的注册WNDCLASS)。 HwndHost托管在WPF边界控件中。

我遇到的问题是我无法将键盘焦点设置为托管的Win32窗口。我希望在图表区域上使用点击时,焦点移动到托管的Win32窗口。我尝试在WM_LBUTTONDOWN上调用SetFocus,但这会把焦点搞砸在应用程序的其余部分。

目前,即使我点击Win32窗口,焦点仍然在左侧的树视图上,如果我按向上/向下光标键,树视图将获取它们,而不是图表窗口。

当用户点击图表区域时,如何让托管的Win32窗口接收键盘输入,直到它点击另一个控件(如树视图或工具栏)?

alt text http://dl.dropbox.com/u/190212/public/wpf_hwndhost.png

编辑:这是窗口主机的C ++ / CLI代码:

template <typename T>
inline T intPtrToPtr(IntPtr value)
{
    return reinterpret_cast<T>(static_cast<void*>(value));
}

public ref class ChartWindowHost : public HwndHost, IKeyboardInputSink
{
private:
    ChartWindow* chartWindow;  // this is a C++ class doing the actual work

protected: 
    virtual HandleRef BuildWindowCore(HandleRef parent) override
    {
        chartWindow = new ChartWindow;
        const HINSTANCE hInstance = intPtrToPtr<HINSTANCE>(Marshal::GetHINSTANCE(Assembly::GetExecutingAssembly()->GetModules()[0]));
        const HWND parentWindow = intPtrToPtr<HWND>(parent.Handle);
        chartWindow->Create(hInstance, parentWindow);
        return HandleRef(this, IntPtr(chartWindow->GetHandle()));
    }

    virtual void DestroyWindowCore(HandleRef /*window*/) override
    {
        chartWindow->Destroy();
        delete chartWindow;
        chartWindow = NULL;
    }
};

1 个答案:

答案 0 :(得分:0)

好吧,msdn说明了必须覆盖HwndHost子类的WndProc() ...