通常在自己的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