【发布时间】:2010-08-19 18:26:28
【问题描述】:
在 WPF 应用程序 (C#) 中,其中一个元素是 Win32 窗口,它是通过重写 HwndHost 类创建的。在任何给定时间,WPF 中大约有 10 个此 Win32 窗口的实例。一个应该完全渲染(工作正常),另外 9 个应该只显示预览,不创建 Win32 窗口,只是一个位图。
我一直在尝试找到生成所述位图的方法。尝试了很多不同的东西,但到目前为止没有任何效果。我遇到的主要问题是 HwndHost.WndProc 仅在窗口可见时才被调用。
我可以截取可见窗口的屏幕截图,将其渲染到内存并创建位图。我只需要在窗口不可见的情况下执行此操作。
我的理解仍然很模糊,所以任何见解都值得赞赏。
【问题讨论】:
-
你是说 HwndHost.WndProc 只在窗口在屏幕上可见时才被调用,还是在窗口至少在屏幕上显示一次后才被调用?很可能直到第一次显示窗口时才创建窗口句柄。如果窗口(或其父窗口)在显示后被隐藏或最小化,您仍然应该在 wndproc 中收到消息。
-
直到窗口第一次出现在屏幕上。是否可以在显示此窗口之前将其绘制到内存中?或者也许一种解决方法是在新窗口中生成 Show();隐藏();然后试着画?
-
请在标签中留下诸如“C#”之类的标签,并将它们放在您的标题之外。这是多余的。
-
是的,您可以在实际显示之前强制创建窗口句柄。访问窗口句柄属性应该足以强制创建句柄(这是一种按需模式)。在开始运行屏幕截图之前尝试读取 HwndHost.Handle。
-
通过设置消息参数来模拟 WM_PAINT 消息 您需要创建一个内存 DC,其中包含位图并包含在 WM_PAINT 参数中。 SendMessage(HwndHost.Handle、WM_PAINT 等)