如何屏蔽ctrl + v 粘贴事件,鼠标右键粘贴事件

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

以上只是大体的流程,还有考虑不周的地方,欢迎补充。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值