我的目标是做一个各对战平台打dota时自定义快捷键的那种对话框。
一开始的想法是只允许对话框输入一个大写字母,然后每次获得焦点时清空对话框。
但是这样明显存在一个问题,就是无法使用TAB、CTRL等游戏时常会用的快捷键。
默认的edit是不接受这些非文本键输入的,所以预期需要对键盘消息进行处理,然后自定义相应的显示字符。
因此重看《windows程序设计》关于键盘的章节。
然后我试着在DlgProc里添加键盘消息处理语句,发现不奏效。
“一般来说,对话框过程只是在对话框创建时初始化子窗口控件,其后处理子窗口传来的消息,最后结束对话框。对话过程一般既不处理WM_PAINT消息,也不直接处理键盘和鼠标的输入。” ——《Windows程序》385页
这里要注意“对话框过程”和“对话框窗口过程”的区别,前者是我们自己写的可见的proc函数,而后者似乎隐藏在系统中。前者只处理部分消息,剩余的全部交给后者。
对话框过程只接受子窗口控件的WM_COMMAND,而edit窗口又不接受tab、caps等键输入。
似乎一筹莫展了。
这时我在百度上搜到一篇文章《使用子类化技术,让对话框中的 Edit 控件接受 TAB 键(纯属抄袭MSDN)》
http://www.cnblogs.com/henryzc/archive/2005/10/28/263605.html
这时候之前研究的子类窗口技术终于派上用场了。
这里说下所谓的窗口子类技术(subclass of the window)是个什么概念。
就是需要对系统提供的控件功能进行扩展或者修正时,可以用setwindowlong函数给子控件定义一个新的过程,在里面处理相关消息。未处理的消息,仍返还给系统原默认的子控件过程。
在MFC中也许可以方便的派生类就搞定了,不过我这用的纯win32 API编程,只能这么麻烦。
试着做一个EditSubclassProc,在其中加入对WM_KEYUP消息的处理,并试着对自身发送消息控制显示。
实验成功!