我在 WinMain 中有缓冲区,我需要在 WndProc 中。如何传递指针?

I have buffer in WinMain which i need inside WndProc. How to pass pointer to it?

提问人:Dosev 提问时间:10/25/2023 最后编辑:Dosev 更新时间:10/25/2023 访问量:86

问:

当我在 WndProc 中处理WM_PAINT时,我需要来自 WinMain 的数据。在本例中,指向 char[] 的指针,但数据类型实际上是无关紧要的。问题是,如何将某些内容从 WinMain 传递到 WndProc。

让它全球化是不可取的,但如果我需要,我会忍受它。 我真的不想将它附加到额外的窗口内存中。 我可以直接在 WinMain 中处理WM_PAINT,但我不知道 Windows 是否曾经发送过此消息而不是将其发布到队列中,如果发送了,那又如何?

c winapi wm-paint

评论

2赞 Remy Lebeau 10/25/2023
将数据存储在窗口内有什么问题?有许多不同的方法可以做到这一点 - 、、、、等。在任何情况下,都是低优先级的合成消息,消息队列会在没有其他消息等待时生成它。但是,这并不能阻止其他代码/库直接发送。像大多数消息一样,最好在 所以它来自哪里并不重要。WNDCLASS::cbWndExtraGWL_USERDATASetProp()SetWindowSubclass()WM_PAINTWM_PAINTWM_PAINTWinProc
0赞 Stuart 10/25/2023
如果您不想使用额外的窗口内存,也许这对您有用。调用 CreateWindow 或 CreateWindowEx(从 WinMain)时,在 lpParam 参数中传递数据的地址(在本例中,数据已经是指针,因此可以传递该指针),然后处理WM_CREATE消息,指针将位于CREATE_STRUCT的 lpCreateParams 成员中(即WM_CREATE消息的 lparam 参数)。然后,可以在窗口过程中将指针分配给静态局部变量。
0赞 Remy Lebeau 10/26/2023
@Stuart,只有当一次只有 1 个窗口实例处于活动状态时,这种方法才可行。
0赞 Stuart 10/29/2023
@RemyLebeau 好点,我想到了一些更明显的原因,为什么这种方法不起作用,但我没有想到。我确实说过“也许这对你有用”。
0赞 IInspectable 10/31/2023
保留和使用每个窗口的内存来存储每个窗口的数据是标准解决方案。如果这对您不起作用,您将需要解释阻止您使用标准解决方案的其他限制。

答: 暂无答案