Win10是否使用新的WM_PAINT消息中断WM_PAINT处理?

时间:2018-05-03 03:38:36

标签: windows winapi

运行时错误的堆栈跟踪文件显示使用WM_PAINT消息调用两次窗口过程。由于第一条WM_PAINT消息(在BeginPaint之后但在EndPaint之前),窗口正在被重新绘制,当突然再次调用窗口过程来处理新的{{3 }} 信息。显然,这是在致电WM_PAINTSetBkColor之后发生的。

我意识到如果我们的应用程序调用{​​{3}}(或使用SelectObjectUpdateWindow发送给自己),可能会发生这种情况,但我不相信这种情况会发生。此外,如果更新区域为空,则SendMessage是无操作,这应该是这种情况,因为WM_PAINT验证了更新区域。

两个客户都报告了这个问题,两个客户都运行Windows 10,但在我们的长期稳定应用程序中从未见过。我想知道是否可能Windows 10(或某些短暂的Windows 10自动更新可能稍后更正)可能已经开始UpdateWindow多余的BeginPaint消息了?!?即使有一些很好的理由发送它们而不是发布它们,但在SendMessage处于活动状态时强制重入绘画似乎是不友好的。

每个请求,这里是堆栈跟踪的伪代码:
RTS:未处理的异常#3:无效的位置
BW line 3056 - RepaintChars
BW line 3071 - RepaintText
BW line 3242 - 重绘(在WM_PAINT之前BeginPaint之后调用)
MAIN第85行 - WindowProcedure(此处处理BeginPaint
无法识别模块
无法识别模块
无法识别模块
BW line 3056 - RepaintChars
BW line 3071 - RepaintText
BW line 2976 - RepaintAround
BW line 3253 - 重绘(在EndPaint之前WM_PAINT之后调用)
MAIN第85行 - WindowProcedure(此处处理BeginPaint
MAIN lin 145 - 主

无论可能无关的"无效位置"顶部的运行时错误,我试图在这里更好地理解好奇的可重入EndPaint消息。堆栈轨迹的顶部可能是下半部分的虚幻重复,但我不这么认为是因为略有差异(例如上半部分没有RepaintAround)以及每个位置如何指向有意义的这些线条呈现出一致的画面。

1 个答案:

答案 0 :(得分:0)

根据评论,我现在意识到我的ext/readline/config.m4处理程序无法通过调用SendMessage / GetMessage / PeekMessage在外部或内部中断,因此我的堆栈跟踪必须是错误的。我的猜测是,较短的WM_PAINT堆栈跟踪可能已放置在较早的WM_PAINT堆栈跟踪之上,形成一个明显一致的故事,误导我认为可重入的WM_PAINT消息是发生。

有些Win10更新的微妙变化似乎有可能触发了这个运行时错误,因为它发生在一个坚如磐石的文本查看工具中,在十年内几乎没有变化。我的堆栈跟踪确实指向了一行代码,这些代码可以更好地抵御不良数据,所以希望能够解决这个问题。我很欣赏Stack Overflow社区帮助我直截了当地了解这一点!