最近在做win8方面的开发,qa报上来一大堆bug。其中有个是界面方面的,情况很奇怪。有个对话框上的按钮,在win8下,鼠标点击能够响应,但是触屏点击不能响应。并且只有那个对话框上的按钮不能响应,其他对话框没有问题。
调试界有句话说得好,能够复现的bug都不是什么bug。
因为有源代码在手,直接attach上去,发现窗口过程函数接收不到WM_LBTNDOWN的消息,WM_MOUSEMOVE消息也没有接收到。幸好我对窗口消息机制比较熟悉,马上看看有没有接收到WM_NCHITTEST。一断点测试就接收到了。看来是程序处理WM_NCHITTEST的时候出了问题。
我又看了下,原来这个dialog是调用API函数DialogBox创建的,它的窗口过程函数中(DlgProc) switch case了几个消息,其中没有WM_NCHITTEST。但问题是,最后函数返回前又调用了DefWIndowProc,也就是说,所有的消息都被处理了。处理了也没有问题,问题最终出在return FALSE上。 msdn上明明说了,没有处理的消息就返回FALSE,这里的情况是即调用DefWIndowProc处理了,又返回了false。
这个bug,最终解决只注释了一行代码,就是将DefWIndowProc的调用去掉。但是,问题却值得我们深思。这仅仅是一个系统升级造成的兼容性问题么?我们的代码里面还有多少这样的隐患呢?
经常看到有些代码,特别是windows 的消息处理上,胡乱return的情况很多。当时也许没有暴露什么问题,但是,迟早要还的。一份健壮的代码,对程序员来说是基本的要求。在400万用户的客户端软件中,我常常面对上传的各种崩溃dump文件苦笑不得。有很多时候,真的就是一个很小的问题啊。