在Windows桌面程序里,如果已确认调用SendMessage跨线程发送,应先考虑其同步等待语义:此时,发送线程会阻塞到接收线程处理完该消息;同一线程内则直接调用目标窗口过程。这个结论适用于Win32 API当前参考下的Windows桌面程序实际调用,不能直接套到所有shell、POSIX或托管封装行为上。

先分清适用边界。用户说“电脑发了消息像卡住”,要先确认程序是否在Windows桌面环境、是否直接调用SendMessage、消息是否跨线程。不同封装可能改变调用方式,不能只凭界面卡顿就认定是SendMessage。
观察时,重点核三件事:调用线程与目标窗口所属线程是否一致;目标窗口属于哪个线程;当前调用栈停在哪里。若发送线程停在消息调用附近,而接收线程正在处理其他耗时任务,跨线程等待就能解释卡顿。同线程调用时没有跨线程排队,窗口过程直接执行,表现会更像当前线程被过程内部逻辑占住。这里不能把“像卡住”直接等同于显卡故障或整机损坏。
风险有几处。返回值依消息而定,不能只看有没有返回就判断消息已按预期处理。消息受UIPI约束,官方限定可发往较低或相同完整性级别的进程线程,不能把不同级别一概当作可送达。排查时不要给任意窗口发测试消息,这可能干扰其他程序;也不要通过关闭安全隔离或简单把消息改成异步来承诺解决,异步化会改变时序和重入条件,未必消除根因。
结果分支可以这样看:如果确认跨线程且接收线程忙,优先查接收线程的消息处理耗时和阻塞点;如果同线程直接调用后卡住,优先查窗口过程内部是否重入、等待或做了长任务;如果涉及不同完整性级别,先确认UIPI是否拦截,而不是继续在显卡、内存或整机上猜。以上都只是判断方向,不是本地实测结论。
下一步,把线程归属、目标窗口、调用栈和消息返回情况交给开发核对超时与重入设计。
城中区台式电脑用户可拨400-877-9605,先整理调用线程、窗口所属线程及脱敏调用栈,不向任意窗口试发消息。电脑快修网提供信息展示与第三方维修对接,具体地址、电脑侧检查是否支持及安排需当次核实,启用范围不代表即时履约。