通常在自己的APP里的密码框,验证码框需要屏蔽复制,粘贴,怎么办呢?
有三种方法:
1 hook 此方法是最完全的,但由于hook是全局的,容易影响到其它代码。
2 子类化文本框, 重写OnPaste函数,拦截WM_Paste消息
3 在PreTranslateMessage里判断键盘扫描码和虚拟码
前两种方法都不能在一个函数里搞定,比较麻烦。这里就介绍第三个方法,具体代码如下:
[cpp] view plain copy
- BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
- {
- if (pMsg->message == WM_APPCOMMAND) return TRUE; // win 2000 以上api, 多媒体键盘, 如 Fn + F1, f2, ...
- if (pMsg->message == WM_RBUTTONDOWN) return TRUE;
- if (pMsg->message == WM_KEYDOWN)
- {
- while (pMsg->wParam >= VK_F1 && pMsg->wParam <= VK_F24) return TRUE;
- switch (pMsg->wParam)
- {
- case VK_CAPITAL:
- //0x8000 是键有否按下
- //0x0001 是键的翻转状态
- if (GetKeyState(VK_CAPITAL) & 0x0001)
- {
- GetDlgItem(IDC_STC_CAPS)->ShowWindow(TRUE);
- GetDlgItem(IDC_STC_CAPS)->SetWindowText(_T("大写状态己开启!"));
- }
- else GetDlgItem(IDC_STC_CAPS)->ShowWindow(FALSE);
- break;
- // ctrl + v, shift + ins, 鼠标右键paste, 菜单键(VK_APPS)paste等
- case VK_LAUNCH_APP1:
- case VK_LAUNCH_APP2:
- case VK_LCONTROL:
- case VK_RCONTROL:
- case VK_SHIFT:
- case VK_LSHIFT:
- case VK_RSHIFT:
- case VK_MENU:
- case VK_LMENU:
- case VK_RMENU:
- case VK_LWIN:
- case VK_RWIN:
- case VK_RBUTTON:
- case VK_EXECUTE:
- case VK_RETURN:
- case VK_SNAPSHOT:
- case VK_INSERT:
- case VK_APPS:
- this->SetFocus(); // 让文本框失去焦点,就无法弹出菜单栏
- return TRUE;
- case 'V':
- static int n = 0; // 第一、二次可以复制
- while (++n > 2 && (::GetKeyState(VK_CONTROL) & 0x8000)) return TRUE;
- break;
- }
- }
- while (::GetKeyState(VK_MENU) & 0x8000)
- {
- return TRUE; // Alt 不会响应 WM_KEYDOWN
- }
- return CDialog::PreTranslateMessage(pMsg);
- }
以上只是大体的流程,还有考虑不周的地方,欢迎补充。
From: http://blog.csdn.net/tiandyoin/article/details/39474569