清淡男今天下午说了,在对话框上的一个 ListView 控件,突然接收不到 WM_NOTIFY/LVN_ITEMACTIVATE 消息了。据了解,之前是可以接收到的,而现在和之前的区别,仅在于把原来的非模态对话框改为了模态对话框。
饶是老汉见多识广,也一下断不明其中蹊跷。开始以为是焦点设置有问题,但是测试发现分明在接收方向键的时候一切又都正常。后来想起一件事来,才连忙问清淡男,四个方向键中间的那个确定键的虚拟键值是什么,清淡男说好像是回车键。
老汉顿悟,可不是么,模态对话框中,在通常情况下,即使是聚焦控件,也有几个按键式接收不到的,有:Enter/Return 键、Esc/Escape 键,以及 Ctrl+Break 键。这三种情况会在模态对话框的消息循环里在调用 TranslateMessage 之前被 IsDialogMessage 所处理。这三种键均会导致对话框窗口回调函数收到一个 WM_COMMAND 消息,其中,回车键将导致参数中的命令 ID 为 IDOK,而后两种则导致参数中的命令 ID 值为 IDCANCEL。尤其是最后那个组合键,如果不是像老汉这样的 Windows Guru,恐怕很多人都不知道。
然而,系统并非没有提供聚焦控件接收这些特殊按键的渠道。一言以蔽之,诀窍就在一个不怎么知名的消息 WM_GETDLGCODE 上。如果有遇到了相同问题的朋友,不妨仔细看看这个消息,反正清淡男已经据此搞定了。祝各位好运。