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