WIN32程序IP Control实现禁止输入非法字符

来源:互联网 发布:淘宝网羊毛衫 编辑:程序博客网 时间:2024/05/17 00:52

刚来公司,要维护一个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();    }}

运行,复制一段文字,鼠标右击,粘贴选项已经灰掉,OK,“Ctrl+V”,咦,有问题,IP控件里的内容被清空了,为什么?不知道难过

算了,活人不能被尿憋死,绕道而行,焦点在控件上的时候禁用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:第一次写技术博客,写的不好,还请见谅。因为我是个忘性大的人,今天做完了,一个月后就忘了,以后养成写博客的习惯,同时我发现写博客可以帮自己梳理思路,有一个清晰的思维。



原创粉丝点击