【问题标题】:WPF HwndHost keyboard focusWPF HwndHost 键盘焦点
【发布时间】:2010-11-17 08:00:32
【问题描述】:

屏幕截图中的图表区域是一个 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;
    }
};

【问题讨论】:

    标签: wpf winapi interop focus hosted


    【解决方案1】:

    好吧,msdn 说了一些关于必须在 HwndHost 子类上覆盖 WndProc()...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多