刚来公司,要维护一个WIN32程序,因为之前用的BCB,根本不知道消息是怎样处理的,好个抓耳挠腮。
一个IP控件,控件本身已经实现了只能键入(注意:只是键入)数字,但是如果Ctrl+V或者鼠标右键粘贴都可以输入非法字符,而且这个控件会默认把非法字符处理成0,比如你输入“192.168.haha.123”,你获取IP后就是“192.168.0.123”,之前尝试子类化控件,可发现还是不行,不知道是不是方法不对,如果有人实现了麻烦告诉我一声。
不过我想,既然不想别人粘贴,那焦点在这个控件上,并且内容发生变化的时候,就清空剪贴板,这样就通过另一种途径防止了别人“Ctrl+V”或者“右键粘贴”输入错误字符了,不过有个缺点,就是剪贴板被清空了,而且只能键入ip地址,不能复制粘贴了,哎,凑合着吧。
通过Spy++我知道了鼠标点击控件会触发WM_COMMAND消息下面的EN_SETFOCUS消息。怎么知道的?哈哈,说了我不会WIN32开发,我是不知道这两个消息的,毕竟工作经验不长嘛!不过有Spy++,你就什么都知道了。Spy++怎么用?哎,你去谷歌吧。
下面是我的截图:
这下好了,在EN_SETFOCUS下面清空剪贴板内容,代码如下:
void OnClearClipboard(HWND hWnd) { if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(hWnd)) { HANDLE hMem = GetClipboardData(CF_TEXT); if (hMem != NULL) { EmptyClipboard(); } CloseClipboard(); } }
算了,活人不能被尿憋死,绕道而行,焦点在控件上的时候禁用Ctrl+V快捷键,失去焦点的时候在启用(不这样打开程序后其他地方就不能用Ctrl+V了,呵呵)。再次用Spy++,发现了失去焦点的消息,
看到了吧,EN_KILLFOCUS消息,好了,附上代码:
if (EN_SETFOCUS == HIWORD(wParam)) { OnClearClipboard(hWnd); RegisterHotKey(hWnd, HOTKEY, MOD_CONTROL, 'V') == 0; } else if (EN_KILLFOCUS == HIWORD(wParam)) { UnregisterHotKey(hWnd, HOTKEY); }
PS:第一次写技术博客,写的不好,还请见谅。因为我是个忘性大的人,今天做完了,一个月后就忘了,以后养成写博客的习惯,同时我发现写博客可以帮自己梳理思路,有一个清晰的思维。