WIN32程序IP Control實現禁止輸入非法字符

剛來公司,要維護一個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:第一次寫技術博客,寫的不好,還請見諒。因爲我是個忘性大的人,今天做完了,一個月後就忘了,以後養成寫博客的習慣,同時我發現寫博客可以幫自己梳理思路,有一個清晰的思維。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章