通常在自己的APP里的密码框,验证码框需要屏蔽复制,粘贴,怎么办呢?
有三种方法:
1 hook 此方法是最完全的,但由于hook是全局的,容易影响到其它代码。
2 子类化文本框, 重写OnPaste函数,拦截WM_Paste消息
3 在PreTranslateMessage里判断键盘扫描码和虚拟码
前两种方法都不能在一个函数里搞定,比较麻烦。这里就介绍第三个方法,具体代码如下:
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);
}
以上只是大体的流程,还有考虑不周的地方,欢迎补充。