我们有几个旧的C ++ Windows应用程序在Windows Creators Update之后停止工作。像许多C ++开发人员一样,我们创建了封装Windows API的C ++包装器。我们通过Set / GetWindowsLongPtr()存储并检索了我们的 this 指针,如下所示(有关如何执行此操作的详细信息,请参阅here):
Window=(cWindow*) GetWindowLongPtr(hWnd,GWLP_USERDATA);
在20年左右的时间里运行良好,但是在最新的Windows更新中,我发现消息循环中的流氓消息并非来自我们的Windows。 GetWindowsLongPtr()返回一个不属于我们的指针,这会导致各种内存访问问题。到目前为止,我已经看到这些流氓窗口的类名是" UserAdapterWindowClass",所以我可以基于此过滤消息处理(我的俗气解决方法)。
这个新的Windows类是什么?它的目的是什么?还有其他人吗?
答案 0 :(得分:0)
您不应该在自己的窗口过程函数之外使用username,passwd=input().split()
while not is_correct(username,passwd):
username,passwd=input().split()
# .. Do something with username and passwd ..
。 well-documented是您自己创建的窗口将成为消息队列的一部分,但是它们将被单独发送到适当的位置,您只需要担心将消息发送到您的窗口程序即可。对于Windows控件(例如编辑框等)尤其如此。
经历了像您这样的崩溃,这表明您的设计不当,但是您可以通过使用GetWindowLongPtr(hWnd, GWLP_USERDATA)
并对照从GetClassWord(hwnd, GCW_ATOM)
获得的ATOM
进行检查来缓解这种情况,或者RegisterClass
,或者,如果您不介意性能下降,可以检查窗口类名称。我建议将程序重构为不要在窗口过程之外使用RegisterClassEx
。